2013-07-06 124 views
5

想知道是否有一種簡單的方法來動態確定模型的關聯是「has_one」還是「has_many」關係(即,這是與一個或多個對象的關聯)。Rails確定關聯是has_one還是has_many

我使用的是MongoMapper,所以我能夠檢查如果一個類klass有一個相關的模型assoc通過

klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::OneAssociation 
klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::ManyAssociation 

一個或一對多的關係,但是這似乎相當笨重,並且不是一般的(即不會爲ActiveRecord協會工作)。我也想避免加載任何對象,所以我很確定instance.assoc.is_a? Array也沒有。

任何想法?

+0

有沒有想過這一個呢?我剛剛找到相同的東西,但只是爲'ActiveRecord' – MCB

回答

6

更新:所以,我偶然發現了反思類方法http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html

你可以得到所有的has_manybelongs_to等與reflect_on_all_associations方法。它都在那裏。或者你可以把關聯到reflect_on_association,它會告訴你,如果它是一個has_manyhas_one等具體做法是:

Model.reflect_on_association(:assoc).macro 

這應該是足夠的所有情況。它實際上並沒有解決我目前正在處理的問題,但它應該解決這個問題。

+0

這不是完美的,但它可以取決於你的類名。考慮一個類'User',其中''has_one'是另一個名爲'UserAttributes'的類。不幸的是,你可以通過'user.user_attributes'來訪問它,它返回false給'respond_to?(assoc_name.singularize)'調用。你可能會爭辯說(你可能是正確的),你應該重命名這個類UserAttributeSet或類似的東西,在這種情況下'singularize'可以工作,但是不能保證你能得到正確的關聯類型實例名稱是單數或複數。 – pariser

+0

好吧,擁有複數模型名稱會違反Rails命名約定(http://itsignals.cascadia.com.au/?p=7),所以你不應該有一個模型UserAttributes。它應該始終是UserAttribute。所以單數或複數應該反映has_one或has_many關係。任何其他問題應該以任何邏輯得到輸入開始處理。 – MCB

+0

事實上,你是對的 - 下面是更好的方式來證明這不能涵蓋所有情況:考慮模型'Fish',其中協會名稱'fish'是不可數的。這意味着「魚」這個詞既是名詞的單數形式又是複數形式(即''fish'.singularize ==「fish'.pluralize'),所以通過這種方式你不知道模型'has_one :魚'或'has_many:魚'。 – pariser