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

Noe*_*ers 5 ruby activerecord ruby-on-rails

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

我正在尝试创建一个帮助方法,创建一个包含每个集合中每个项目的菜单.我想使用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
Run Code Online (Sandbox Code Playgroud)

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

do_something_with( item.collection_item.collection_item_id )
Run Code Online (Sandbox Code Playgroud)

编辑:感谢serioys sam指出上面显然是错误的

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

do_something_with( item.position )
Run Code Online (Sandbox Code Playgroud)

和:

do_something_with( item.collection_item.position )
Run Code Online (Sandbox Code Playgroud)

编辑:感谢serioys sam指出上面显然是错误的

但他们也失败了.

任何人都可以建议我如何处理这个?

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

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

目前我正在修改我的Collection模型,如下所示:

class Collection < ActiveRecord::Base
  has_many :collection_items, :order => :position, :include => :item
  ...
end
Run Code Online (Sandbox Code Playgroud)

并更改帮助程序以使用coll.collection_items而不是coll.items

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

我改变了我的帮手,如上所述工作,它工作正常 - (谢谢山姆)

这让我的代码变得一团糟 - 因为其他因素在这里没有详细说明 - 但是重新分解的一两个小时都不会解决.

ser*_*sam 3

在您的示例中,您已在 Item 模型关系中将 collection_items 和 collections 定义为 has_many ,生成的关联方法是 collection_items 和 collections 分别返回一个数组,因此您尝试在此处访问的方式是错误的。这主要是多人关系的情况。只需查看此协会文档以获取进一步参考。