2015-07-10 23 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 
相关问题