2012-06-05 59 views
6

兩個特定的記錄查找記錄我有一個Product模型has_and_belongs_to_many :taxons,我想找到那些特定分類羣的所有產品。例如,如果產品屬於「Ruby on Rails」和「襯衫」分類羣,則我希望該產品能夠返回到數據集中,但如果它僅屬於「Ruby on Rails」中的而不是 「或‘襯衫’與另一個表

回答

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

一個互聯網給你,先生。 –

+0

@RyanBigg也看看這個寶石:https://github.com/ernie/squeel。它在ARel上增加了一層抽象。它允許您構建更簡潔/可讀的查詢。即使在'taxons.name.in taxons'或'taxons.name >> taxons'不超過嵌套哈希好多了,如果你需要超過2個層次的加盟你就會明白這個鏈接。你可以讓你的'having'東西W/O調用'arel_table',如:'有{數量(ID)== some_size}'。 – jdoe

0

假設的表現是不是一個要求:

a = Taxon.find_by_name!('Ruby on Rails').products.pluck(:id) 
b = Taxon.find_by_name!('Shirts').products.where(:id => a) 
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 

這對我的作品,感到非常痛苦。不過,我打開更好的選擇。