2015-07-10 30 views
3

我有三個型號導軌 - 通過聯想獲得從的has_many =>名稱作爲字符串

class Mar < ActiveRecord::Base 
    belongs_to :baz 
    belongs_to :koo 
end 

class Baz < ActiveRecord::Base 
    has_many :other_mars, :class_name => "Mar", :foreign_key => :b 
end 

class Koo < ActiveRecord::Base 
    has_many :mars 
    has_many :bazs, :through => :mars, :source => :baz 
end 

並從模型巴茲我想獲得的has_many的字符串名字。在這個例子中,它是「other_mars」

該解決方案必須適用於傳遞給它的class_name的任何類似的has_many關係。

我用Rails 3.2和Ruby 1.9

+0

像這樣的問題中的常見問題 - 你需要什麼? – BroiSatse

+0

我需要它作爲搜索寶石的一部分。它通過關聯很好地搜索has_many =>,但是一旦聲明瞭一個與class_name不同的名稱(比如這裏的「other_mars」),它就會中斷。如果我能夠得到那個has_many的名字,生活對我來說會非常簡單:D –

+0

你的意思是......像ransack? – BroiSatse

回答

1

如果我正確理解您的要求來獲得,下面的代碼可以幫助

result = Baz.reflect_on_all_associations.collect do |association| 
    association.name.to_s if association.options[:class_name].present? 
end.compact 

在你的情況下,上面的代碼結果['other_mars']。即它返回用:class_name鍵聲明的所有associations

1

我想獲得的has_many的字符串名字。在這個例子中是「other_mars」

如果你正在尋找的是一個模型相關的協會,在你的情況Baz在項目目錄和類型打開你的鐵軌控制檯:

Baz.reflect_on_all_associations(:has_many) 

這將返回一個ActiveRecord對象和屬性@name下的關聯列表。

所以聯想到一個字符串的名稱可以通過輸入

Baz.reflect_on_all_associations(:has_many).name.to_s