【问题标题】:How do I specify associations in Rails that pass through several models如何在 Rails 中指定通过多个模型的关联
【发布时间】:2010-08-02 04:23:46
【问题描述】:

我正在编写一些棘手的多态关系来处理标记。

我有一个Tag 模型和一个Tagging 模型,它属于多态taggable

我有一个Item 模型,其中has_many :taggings, :as => :taggablehas_many :tags, :through => :taggings,所以我可以调用@item.tags

一切正常。

我想加入另一个模型 - Storehas_many :items。我希望能够使用@store.tags 找到与商店中所有商品关联的所有标签。

这是我所拥有的:

class Store < AR::Base
  has_many :items
  has_many :tags, :through => :items, :source => :taggings

但是,这会返回与商店中的商品关联的所有 taggings,而不是实际的标签。

如何通过项目、标签指定商店有多个标签?

如果需要,可以发布更多信息 - 尽量防止信息过载!谢谢:)

【问题讨论】:

    标签: ruby-on-rails activerecord tags tagging polymorphic-associations


    【解决方案1】:

    has_many 关联的来源必须是belongs_tohas_onehas_many 关联没有:through 选项(感谢this answer 提供信息)。

    有些人已经成功使用了a plugin,但在我的情况下,它似乎无法与我的taggable 多态关联正常工作。

    目前,我的解决方案是将finder_sql 选项传递给has_many

    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
    

    【讨论】:

      【解决方案2】:

      你可以用普通的 Ruby 做:

      site.wares.map(&:tags).flatten.uniq
      

      这将是低效的,除非您的标签/商品/物品数量很少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多