首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >狂欢:分类群之间的交集

狂欢:分类群之间的交集
EN

Stack Overflow用户
提问于 2014-04-01 15:19:22
回答 3查看 1.3K关注 0票数 0

是否可以查询属于多个分类单元的产品?就像一个数学交汇处。

例如:我卖属于分类法大学> ASU的书,属于分类学课程>工程学

我希望能够查询所有属于ASU工程路径的书籍。有点像

代码语言:javascript
复制
Spree::Product.in_taxon(asu_taxon).in_taxon(eng_taxon)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-01 16:38:19

有几种方法可以做到。我将使用狂潮沙箱数据,所以如果您感兴趣,可以尝试结果。

首先,我们可以迭代所有产品,并使用纯Ruby检查它们的分类:

代码语言:javascript
复制
Spree::Product.all.select do |product|
  taxon_names = product.taxons.map(&:name)  
  taxon_names.include?("Rails") && taxon_names.include?("Bags")  
end

这样做的缺点是,它必须从数据库中检索所有产品,然后在单独的查询中检索它们的所有分类单元。如果你有相当数量的产品,它会很慢。

我们可以把它做得更好:

代码语言:javascript
复制
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联接来多次加入该表,以便将其简化为一个查询,该查询检索所需的所有记录:

代码语言:javascript
复制
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查询就可以获得所需的产品。

也许没有那么糟糕的方法,但这是我拥有的最好的方法!

票数 2
EN

Stack Overflow用户

发布于 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") )')

票数 0
EN

Stack Overflow用户

发布于 2015-03-26 00:31:36

我有相同的用例,并最终这样做了:

代码语言:javascript
复制
Product.joins(:classifications)
  .where(classifications: {taxon_id: taxon_ids})
  .group('products.id')
  .having('COUNT("products"."id") = ?', taxon_ids.count)

希望它能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22790067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档