has_many :通过关联与一对多合作
has_many :through Association working with one-to-many
- 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
最快的方法是 category_object.products.map(&:tags).flatten
。可以改进。 :)
类别有很多产品,产品有很多标签。在每个产品上映射标签方法。展平以删除重复项。
您可以将 product_tags
关联添加到 Category
class:
class Category < ActiveRecord::Base
has_many :products
has_many :product_tags, -> { uniq }, through: :products
end
当您访问 product_tags
关联时,Rails 将使用 SELECT DISTINCT
查询,这样您就不会得到重复的标签并且数据库会消除重复项。
如果以上内容对您的模型来说不自然,那么您还可以使用以下内容(假设 c
是一个 Category
实例):
Tag.joins(:products).where(products: { category: c})
数据库查询与另一个示例非常相似。
- 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
最快的方法是 category_object.products.map(&:tags).flatten
。可以改进。 :)
类别有很多产品,产品有很多标签。在每个产品上映射标签方法。展平以删除重复项。
您可以将 product_tags
关联添加到 Category
class:
class Category < ActiveRecord::Base
has_many :products
has_many :product_tags, -> { uniq }, through: :products
end
当您访问 product_tags
关联时,Rails 将使用 SELECT DISTINCT
查询,这样您就不会得到重复的标签并且数据库会消除重复项。
如果以上内容对您的模型来说不自然,那么您还可以使用以下内容(假设 c
是一个 Category
实例):
Tag.joins(:products).where(products: { category: c})
数据库查询与另一个示例非常相似。