是否可以查询属于多个分类单元的产品?就像一个数学交汇处。
例如:我卖属于分类法大学> ASU的书,属于分类学课程>工程学
我希望能够查询所有属于ASU工程路径的书籍。有点像
Spree::Product.in_taxon(asu_taxon).in_taxon(eng_taxon)发布于 2014-04-01 16:38:19
有几种方法可以做到。我将使用狂潮沙箱数据,所以如果您感兴趣,可以尝试结果。
首先,我们可以迭代所有产品,并使用纯Ruby检查它们的分类:
Spree::Product.all.select do |product|
taxon_names = product.taxons.map(&:name)
taxon_names.include?("Rails") && taxon_names.include?("Bags")
end这样做的缺点是,它必须从数据库中检索所有产品,然后在单独的查询中检索它们的所有分类单元。如果你有相当数量的产品,它会很慢。
我们可以把它做得更好:
Spree::Product.joins(:taxons).includes(:taxons).where(spree_taxons: { name: ["Rails", "Bags"]}).all.select do |product|
taxon_names = product.taxons.map(&:name)
taxon_names.include?("Rails") && taxon_names.include?("Bags")
end这将只获取属于这两个分类法中的一个的产品,并使用一个查询检索所有的分类法数据。它会更快,但我们可以做better...kind的.
您可以使用SQL联接来多次加入该表,以便将其简化为一个查询,该查询检索所需的所有记录:
Spree::Product
.joins('INNER JOIN spree_products_taxons rails_join ON (spree_products.id = rails_join.product_id)')
.joins('INNER JOIN spree_taxons rails_taxon ON (rails_join.taxon_id = rails_taxon.id AND rails_taxon.name == "Rails")')
.joins('INNER JOIN spree_products_taxons bags_join ON (spree_products.id = bags_join.product_id)')
.joins('INNER JOIN spree_taxons bags_taxon ON (bags_join.taxon_id = bags_taxon.id AND bags_taxon.name == "Bags")')这有点难看,但它是获取数据的最快方法,因为您只需要使用一个SQL查询就可以获得所需的产品。
也许没有那么糟糕的方法,但这是我拥有的最好的方法!
发布于 2014-07-15 03:14:09
你可以试试Spree::Product.joins('INNER JOIN spree_products_taxons rails_join ON (spree_products.id = rails_join.product_id)').joins('INNER JOIN spree_taxons rails_taxon ON (rails_join.taxon_id = rails_taxon.id AND rails_taxon.name NOT IN ("Hide", "Old") )')
发布于 2015-03-26 00:31:36
我有相同的用例,并最终这样做了:
Product.joins(:classifications)
.where(classifications: {taxon_id: taxon_ids})
.group('products.id')
.having('COUNT("products"."id") = ?', taxon_ids.count)希望它能帮上忙
https://stackoverflow.com/questions/22790067
复制相似问题