【问题标题】:Rails - Get the name from a has_many => through association as a stringRails - 通过关联从 has_many => 获取名称作为字符串
【发布时间】:2015-07-10 21:19:33
【问题描述】:

我有三个模型

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

我想从模型 Baz 中获取 has_many 名称作为字符串。在这个例子中是“other_mars”

该解决方案必须适用于传递给它的 class_name 的任何类似 has_many 关系。

我正在使用 Rails 3.2 和 ruby​​ 1.9

【问题讨论】:

  • 此类问题中的常见问题 - 你需要它做什么?
  • 我需要它作为搜索 gem 的一部分。它通过关联很好地搜索 has_many =>,但是一旦声明的名称与 class_name 不同(如此处的“other_mars”),它就会中断。如果我能得到那个 has_many 的名字,我的生活会很轻松 :D
  • 你是说洗劫之类的?

标签: ruby-on-rails ruby activerecord


【解决方案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

【讨论】:

    【解决方案2】:

    我想将 has_many 名称作为字符串获取。在这个例子中是“other_mars”

    如果您要查找的是模型的相关关联,在您的情况下,Baz 在项目目录中打开您的 rails 控制台并输入:

    Baz.reflect_on_all_associations(:has_many)
    

    这将返回一个 ActiveRecord 对象,其中包含属性 @name 下的关联列表。

    所以可以通过键入来获得与字符串的关联名称

    Baz.reflect_on_all_associations(:has_many).name.to_s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2017-11-27
      • 1970-01-01
      • 2015-01-27
      • 2015-12-19
      • 2012-06-20
      相关资源
      最近更新 更多