2013-07-06 15 views
5

Modelin ilişkilendirmesi "has_one" veya "has_many" ilişkisiyse (yani, bu, bir nesneye veya çokluğuna yönelik bir ilişki ise) dinamik olarak belirlenmesinin kolay bir yolu olup olmadığını merak etme.İlişkilendirmeler has_one veya has_many olup olmadığını belirler Raylar

Ben MongoMapper kullanıyorum

, bu yüzden bir sınıf klass

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

aracılığı ile bir veya birçok ilişki ile ilişkili bir modeli assoc var ama bu oldukça aksak görünüyor ve jenerik değilse kontrol edebilirler duyuyorum (yani ActiveRecord dernekleri için de çalışmayacaktır). Ayrıca herhangi bir nesneyi yüklemekten kaçınmak istiyorum, bu yüzden ben de instance.assoc.is_a? Array'un da çok iyi olduğuna eminim.

Herhangi bir fikrin var mı?

+0

Bunu bir an önce anladın mı? Sadece aynı şeyi bulmaya geldim, ama sadece ActiveRecord için – MCB

cevap

6

GÜNCELLEME: Yani, Yansımalar Sınıf yöntemlerle http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html

üzerine oldu Sen reflect_on_all_associations yöntemle tüm has_many, belongs_to vs. alabilirsiniz. Her şey orada. Yoksa reflect_on_association içine bir dernek koyabilirsiniz ve vb Özellikle bir has_many, has_one, eğer o size söyleyecektir:

Model.reflect_on_association(:assoc).macro 

Bu, tüm durumlar için yeterli olmalıdır. Şu an üzerinde çalıştığım problemi çözmüyor, ama bunu çözmeli.

+0

Mükemmel değil, ama sınıf isimlerine bağlı olarak çalışabilir. "UserAttributes" adlı başka bir sınıfın "has_one" olan bir "Kullanıcı" sınıfını düşünün. Maalesef buna 'user_user_attributes' üzerinden 'response_to? (Assoc_name.singularize)' çağrısına false değerini döndürürsünüz. Bu sınıfı "UserAttributeSet" veya benzeri bir şeyi yeniden adlandırmanız gerektiğini (ve muhtemelen doğru olabilirsiniz) tartışabilirsiniz, bu durumda "singularize" çalışırdı, ancak ilişkilendirme türünün doğru olup olmayacağına dair hiçbir garanti yoktur. örnek adı tekil veya çoğuldur. – pariser

+0

Çoğul bir model ismine sahip olmak, Rails adlandırma kurallarına (http://itsignals.cascadia.com.au/?p=7) karşı gelecektir, bu yüzden hiçbir zaman bir UserAttributes modeline sahip olmamanız gerekir. Her zaman UserAttribute olmalıdır. Yani tekil veya çoğul bir has_one veya has_many ilişkisini yansıtmalıdır. Diğer herhangi bir endişe, giriş için hangi mantığın girdiği ile ele alınmalıdır. – MCB

+0

Gerçekten de haklısınız - işte bunun her davanın kapsamı dışında olmadığını göstermenin daha iyi bir yolu var: “Balık” adlı dernek isminin “balık” kelimesinin sayılamayacağını düşünün. Bu, "balık" kelimesinin adın tekil ve çoğul biçimi olduğu anlamına gelir (yani "balık" .singularize == "fish" .pluralize "), bu sayede bir modelin var olup olmadığını bilmezsiniz. : balık veya has_many: balık. – pariser

İlgili konular