我有一个类似这样的数据模型:
# 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/