2010-11-13 32 views
48

對於普通列,可以通過columns類方法獲取。但是,如果在關係方法中設置了foreign_key選項,則關聯可能會有很大的不同。例如,給定如何通過反射獲得主動記錄關聯

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

如果我沒有Post.column_names我可以在message_id得到的,但有什麼辦法讓comments

回答

76

Model.reflections提供有關模型關聯的信息。這是一個Hash鍵關聯的名稱。例如

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

下面是它可以用來訪問某些信息的示例:

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

注:基於MCB這個答案已經更新到覆蓋Rails的4.2'回答和下面的評論。在Rails的早期版本中,反射的foreign_key被改爲使用primary_key_name來訪問,並且取決於如何定義關聯,反射的鍵可以是符號而不是字符串,例如, :comments而不是"comments"

+1

正是我在找的東西,謝謝:) – 2010-11-14 06:08:14

+2

FYI傢伙,反射只是返回一個散列,而不是一個HashWithIndifferentAccess。所以.reflections哈希鍵將是一個符號或一個字符串,取決於它在模型定義中所說的內容。這只是絆住了我,認爲它會是或者。 – taelor 2012-04-02 17:14:58

+0

正如MCB在他的回答中所說的,在Rails 4.2中,你會說'Post.reflections [「comments」]'而不是 – 2015-04-10 10:28:19

20

對於軌道4,5未來的Google現在答案是:

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

從這裏摘自:https://stackoverflow.com/a/15364743/2167965

編輯:

reflections,爲4.2,現在只需字符串,而不是符號這是追蹤的有趣錯誤。如果你想繼續使用符號,你應該切換到reflect_on_association(:assoc_name)。另外請注意,reflections實際上是the public api,它將繼續報告諸如HABTM之類的內容,即使這些內容都有很多內容。 Rails的實際使用的反射現在在_reflections

+12

非常感謝。我是未來的Google員工。 :) – epochwolf 2014-01-13 16:36:46

-1

因爲我使用一個ActiveRecord對象:

object._reflections 

所以,我可以操縱散列返回。例如:

object._reflections.keys.each do |key| 
    object.public_send(key).destroy_all 
end 

上面的例子刪除了數據庫中的所有關係。