ruby-on-rails - 使用 has_many :through 时如何访问 Rails 连接模型属性

标签 ruby-on-rails ruby activerecord

我有一个类似这样的数据模型:

# columns include collection_item_id, collection_id, item_id, position, etc
class CollectionItem < ActiveRecord::Base
  self.primary_key = 'collection_item_id'
  belongs_to :collection
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :collection_items
  has_many :collections, :through => :collection_items, :source => :collection
end

class Collection < ActiveRecord::Base
  has_many :collection_items, :order => :position
  has_many :items, :through => :collection_items, :source => :item, :order => :position
end

一个项目可以出现在多个集合中,也可以在同一个集合中的不同位置出现不止一次。

我正在尝试创建一个辅助方法来创建一个菜单,其中包含每个集合中的每个项目。我想使用 collection_item_id 来跟踪请求之间当前选择的项目,但我无法通过 Item 类访问连接模型的任何属性。

def helper_method( collection_id )
  colls = Collection.find :all
  colls.each do |coll|
    coll.items.each do |item|
# !!! FAILS HERE ( undefined method `collection_item_id' )
      do_something_with( item.collection_item_id )
    end
  end
end

我也试过了,但它也失败了(未定义的方法`collection_item')

do_something_with( item.collection_item.collection_item_id )

编辑:感谢 serioys sam 指出以上明显错误

我还尝试访问连接模型中的其他属性,如下所示:

do_something_with( item.position )

和:

do_something_with( item.collection_item.position )

编辑:感谢 serioys sam 指出以上明显错误

但他们也失败了。

谁能告诉我如何进行此操作?

编辑:-------------------->

我从在线文档中发现,使用 has_and_belongs_to_many 会将连接表属性附加到检索到的项目,但显然它已被弃用。我还没试过。

目前我正在像这样修改我的 Collection 模型:

class Collection < ActiveRecord::Base
  has_many :collection_items, :order => :position, :include => :item
  ...
end

并更改助手以使用 coll.collection_items 而不是 coll.items

编辑:-------------------->

我已将我的助手更改为按上述方式工作并且工作正常 - (谢谢你 sam)

这让我的代码变得一团糟 - 因为这里没有详细说明的其他因素 - 但没有什么是一两个小时的重构无法解决的。

最佳答案

在您的示例中,您在 Item 模型关系中为 collection_items 和集合定义了 has_many,生成的关联方法分别为 collection_items 和 collections,它们都返回一个数组,因此您在此处尝试访问的方式是错误的。这主要是曼对多关系的情况。只需检查这个 Asscociation Documentation以供进一步引用。

关于ruby-on-rails - 使用 has_many :through 时如何访问 Rails 连接模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637981/

相关文章:

html - .each 在 HTML Slim 中做其他声明

Ruby 轻松访问类变量

ruby-on-rails - 如何获得特定佣金任务的帮助?

jquery - 如何在Rails中使用下拉菜单和ajax过滤数据

mysql - ActiveRecord SQL 语句未返回正确的数据

ruby-on-rails - 设计注册错误

ruby-on-rails - 在数组中发送数据的多个单选按钮组

mysql - 浏览器显示 MySQL 错误,我没有列

sql - 在SQL中按DATE分组,返回nil

linq-to-sql - 与 DDD、存储库模式和相关领域模型作斗争