has_many:通过协会与一对多合作

时间:2015-03-17 16:03:24

标签: ruby-on-rails ruby-on-rails-4 model associations

  • rails 4.2
  • ruby​​ 2.1

我有两个非常基本的模型(产品和标签),通过另一个模型(标记)与has_many关联。

我有另一个模型(类别)与上述模型(产品)的一对多连接。

问题:

如何在具有特定产品类别的产品中显示标记列表

换句话说:是否可以列出特定类别产品的所有标签?

型号:

class Product < ActiveRecord::Base
  has_many :taggings
  has_many :tags, through: :taggings
  belongs_to :category, counter_cache: true
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :products, through: :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :product
  belongs_to :tag, counter_cache: :products_count
end

class Category < ActiveRecord::Base
  has_many :products
end

2 个答案:

答案 0 :(得分:1)

最快的方式是category_object.products.map(&:tags).flatten。可以改进。 :)

类别有很多产品,产品有很多标签。在每个产品上映射标签方法。展平以删除重复项。

答案 1 :(得分:1)

您可以向product_tags类添加Category关联:

class Category < ActiveRecord::Base
  has_many :products
  has_many :product_tags, -> { uniq }, through: :products
end

当您访问product_tags关联时,Rails将使用SELECT DISTINCT查询,因此您不会得到重复的标记,而数据库将消除重复。

如果上述情况对您的模型感觉不自然,那么您还可以使用以下内容(假设cCategory个实例):

Tag.joins(:products).where(products: { category: c})

数据库查询与其他示例非常相似。