我有一个像这样的数据模型:
# 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
编辑:-------------------->
我改变了我的帮手,如上所述工作,它工作正常 - (谢谢山姆)
这让我的代码变得一团糟 - 因为其他因素在这里没有详细说明 - 但是重新分解的一两个小时都不会解决.