여러 taxons에 속하는 제품을 쿼리 할 수 있습니까? 수학 교차로처럼. 예를 들어번쩍 번쩍하는 부분 : taxons 사이의 교차
: 나는 대학> ASU를 분류군에 속하는 코스> 공학
나는 ASU 엔지니어링 경로에 속한 모든 도서에 대한 쿼리 수 있도록하고 싶습니다 분류군에 속하는 책을 판매하고 있습니다. 와 비슷한 것
Spree::Product.in_taxon(asu_taxon).in_taxon(eng_taxon)
여러 taxons에 속하는 제품을 쿼리 할 수 있습니까? 수학 교차로처럼. 예를 들어번쩍 번쩍하는 부분 : taxons 사이의 교차
: 나는 대학> ASU를 분류군에 속하는 코스> 공학
나는 ASU 엔지니어링 경로에 속한 모든 도서에 대한 쿼리 수 있도록하고 싶습니다 분류군에 속하는 책을 판매하고 있습니다. 와 비슷한 것
Spree::Product.in_taxon(asu_taxon).in_taxon(eng_taxon)
몇 가지 방법이 있습니다. 흥미 진진한 샌드 박스 데이터를 사용하려고합니다. 그래서 관심이 있다면 결과를 시도해 볼 수 있습니다.
첫째, 우리는 순수한 루비 모든 제품을 통해 반복하고 사용하여 taxons을 확인할 수 있습니다
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
이는 두 taxons 중 하나에 속하는 제품을 얻을 것이고, 단일 쿼리를 사용하여 분류군의 모든 데이터를 검색 :
우리는 조금 더 나은에 있는지 확인 할 수 있습니다. 훨씬 빨라지 겠지만 ... 더 잘할 수 있습니다 ...
테이블을 여러 번 조인하기 위해 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 쿼리를 사용하여 원하는 제품 만 얻을대로, 데이터를 얻을 수있는 가장 빠른 방법입니다.
나쁘지는 않을 수도 있지만 이것이 최선입니다!
당신은 내가 같은 사용 사례를 가지고이 일을 결국 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"))')
을 시도 할 수 :
Product.joins(:classifications)
.where(classifications: {taxon_id: taxon_ids})
.group('products.id')
.having('COUNT("products"."id") = ?', taxon_ids.count)
는
좋은 희망이 도움! Taxon 교차로 필터를 처리 할 컨트롤러를 만드는 데 관심이없는 이유가 무엇인지 알고 있습니까? 아니면 적어도 확장? – alexandrecosta
그런 확장자가 있는지 나는 모른다. 나는 많은 사람들이해야 할 일이 아니라고 상상한다. 대부분의 상점은 사람들이 배수가 아닌 단일 분류군을 통해 탐색하도록합니다. – gmacdougall