我正在编写一些棘手的多态关系来处理标签。
我有一个Tag模型,和一个Tagging模型,它belongs_to一个多态的taggable。
我有一个Item模型,它是has_many :taggings, :as => :taggable和has_many :tags, :through => :taggings,所以我可以调用@item.tags。
这一切都正常工作。
我想引入另一个模型-- has_many :items的Store。我希望能够使用@store.tags找到与商店中所有商品相关联的所有标签。
这就是我所拥有的:
class Store < AR::Base
has_many :items
has_many :tags, :through => :items, :source => :taggings但是,这将返回与商店中的商品相关联的所有taggings,而不是实际的标签。
如何指定商店的has_many标签,通过商品,通过标签?
如果需要,可以发布更多信息-努力防止信息过载!谢谢:)
发布于 2010-08-05 12:23:02
has_many关联的源必须是不带:through选项的belongs_to、has_one或has_many关联(感谢this answer提供信息)。
有些人已经成功地使用了a plugin,但在我的例子中,它似乎不能正确地与我的taggable多态关联一起工作。
目前,我的解决方案是向has_many传递一个finder_sql选项
class Store < ActiveRecord::Base
has_many :items
has_many :tags, :finder_sql =>
'SELECT tags.* from tags
INNER JOIN taggings on tags.id = taggings.tag_id
INNER JOIN items on items.id = taggings.taggable_id AND taggings.taggable_type = "Item"
WHERE items.store_id = #{id}'
end发布于 2010-08-02 23:23:26
你可以在普通的Ruby中做到:
site.wares.map(&:tags).flatten.uniq但是,这将是低效的,除非你的标签/商品/项目数量很少。
https://stackoverflow.com/questions/3384969
复制相似问题