在另一个表中查找具有两个特定记录的记录

时间:2012-06-05 03:53:26

标签: ruby-on-rails

我有一个Product模型has_and_belongs_to_many :taxons,我想查找特定分类中的所有产品。

例如,如果产品同时属于“Ruby on Rails”和“Shirts”分类,我希望该产品在数据集中返回,但如果它只属于“Ruby on Rails”或“Shirts”

3 个答案:

答案 0 :(得分:13)

我有一段时间没遇到这个问题了,幸好有一个很好的解决方案。

def self.has_taxons(taxons)
  id = arel_table[:id]
  Product.joins(:taxons).where(taxons: { name: taxons }).group(id).having(id.count.eq(taxons.size))
end

答案 1 :(得分:1)

来自@samuel的答案正是我所寻找的,但我希望能够在按Taxon1和Taxon2以及TaxonN过滤时仍然为搜索提供关键字。我不需要进行Taxon1或Taxon2搜索,因此我进行了以下自定义。可能有一种不太常见的方法,但它对我很有用。

我在/app/models/spree/product_decorator.rb中添加了新的产品范围

Spree::Product.class_eval do
    add_search_scope :in_all_taxons do |*taxons|
        taxons = get_taxons(taxons)
        id = arel_table[:id]
        joins(:taxons).where(spree_taxons: { id: taxons }).group(id).having(id.count.eq(taxons.size))
    end
end

然后将新范围添加到/app/models/spree/base_decorator.rb

Spree::Core::Search::Base.class_eval do
    def get_base_scope
        base_scope = Spree::Product.active
        base_scope = base_scope.in_all_taxons(taxon) unless taxon.blank?
        base_scope = get_products_conditions_for(base_scope, keywords)
        base_scope = add_search_scopes(base_scope)
        base_scope
    end
end

现在我可以使用标准搜索帮助程序来检索产品(这意味着我仍然可以提供关键字等以及多个分类单元):

# taxon_ids is an array of taxon ids
@searcher = build_searcher(params.merge(:taxon => taxon_ids))
@products = @searcher.retrieve_products

这适合我,感觉很轻松。但是,我愿意接受更好的选择。

答案 2 :(得分:0)

假设性能不是必需的:

a = Taxon.find_by_name!('Ruby on Rails').products.pluck(:id)
b = Taxon.find_by_name!('Shirts').products.where(:id => a)