2010-11-13 24 views
48

aracılığıyla activerecord ilişkilendirmeleri nasıl alınır, sen columns sınıf yöntemi ile onlara alabilirsiniz. Ancak dernekler foreign_key seçenek ilişki yönteminde ayarlanırsa oldukça farklı bir ad verilmiş olabilir. Mesela ben Post.column_names yaptıysam message_id de alabilirNormal sütunları için yansıma

class Post 
    has_many :comments, :foreign_key => :message_id # this is a contrived example 
end 

verilen ancak comments almak için herhangi bir yolu var mı?

cevap

76

Model.reflections bir modelin dernekler hakkında bilgi verir. İlişkilendirme adına yazılan bir Hash. Örneğin.

Post.reflections["comments"].table_name # => "comments" 
Post.reflections["comments"].macro # => :has_many 
Post.reflections["comments"].foreign_key # => "message_id" 

Not: Bu cevap MCB dayalı Rails 4.2 kapsayacak şekilde güncellendi İşte

Post.reflections.keys # => ["comments"] 

o erişmek için kullanılabilir bilgilerden bazılarını bir örnektir cevap ve aşağıdaki yorumlar. Raylar önceki sürümlerinde yansıma en foreign_key yerine primary_key_name kullanılarak erişilen ve yansımalar için anahtarlar ilişki, örneğin tanımlandı şekline bağlı olarak semboller yerine şeritler olabilir :comments yerine "comments". Raylar 4'te gelecek Google Çalışanları için

+1

Tam olarak aradığım şey, teşekkürler :) –

+2

FYI çocuklar, yansımalar sadece karma değil, HashWithIndifferentAccess döndürür. Yani .reflections karmasının tuşları o modeli tanımında ne diyor bağlı bir sembol ya da bir dize olacaktır. Bu, ya beni ya da olduğunu düşünerek beni heyecanlandırdı. – taelor

+0

MCB'nin cevabında söylediği gibi, Rails 4.2'de "Post.reflections [" comments "]' yerine –

20

cevap şimdi şöyle olacaktır:

Post.reflections[:comments].foreign_key # => "message_id" 

buradan Alındığı: https://stackoverflow.com/a/15364743/2167965

DÜZENLEME: 4.2 itibariyle

reflections

, şimdi alır dizeleri yerine sembollerin Bu aşağı izlemek için eğlenceli bir hatadır. Sembolleri kullanmaya devam etmek istiyorsanız, reflect_on_association(:assoc_name)'a geçmelisiniz. Ayrıca reflections no'lu notun aslında the public api no'lu dip notu, HABTM gibi şeyleri rapor etmeyi sürdürecek. Raylar aslında kullanıyor yansımalar kullandığım bir ActiveRecord nesnesi için _reflections

+12

Çok teşekkür ederim. Ben geleceğin googuyuyum. :) – epochwolf

-1

şimdi:

object._reflections 

Yani, Hash iade idare edebilirsiniz. Örneğin: Yukarıdaki örnek veritabanındaki tüm ilişkileri siler. Yukarıdaki örnek veritabanındaki tüm ilişkileri siler.