2012-06-05 16 views
6

मेरे पास Product मॉडल है जो has_and_belongs_to_many :taxons है, और मैं विशिष्ट टैक्सन में मौजूद सभी उत्पाद ढूंढना चाहता हूं।किसी अन्य तालिका में दो विशिष्ट रिकॉर्ड के साथ रिकॉर्ड ढूंढना

उदाहरण के लिए, एक उत्पाद अंतर्गत आता है, तो, मैं चाहता हूँ कि उत्पाद डेटासेट में लौटा दी है, लेकिन नहीं अगर यह केवल या तो "पर रूबी के अंतर्गत आता है, दोनों के लिए" पर रूबी "और" शर्ट "टैक्सोन "या" शर्ट "

उत्तर

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। यह एआरएल पर अमूर्तता की एक परत जोड़ता है। यह आपको अधिक संक्षिप्त/पठनीय प्रश्न बनाने की अनुमति देता है। यहां तक ​​कि 'taxons.name.in टैक्सन 'या' taxons.name >> टैक्सन 'नेस्टेड हैंश की तुलना में इतना बेहतर नहीं है, अगर आपको कभी भी जुड़ने के 2 से अधिक स्तर की आवश्यकता होती है तो आप इस श्रृंखला को सराहना करेंगे। और आप ''all_table' को कॉल करते हुए अपने' सामान 'सामान बना सकते हैं, जैसे:' count {count (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 के आधार पर फ़िल्टर, जबकि अभी भी खोज के लिए कीवर्ड आपूर्ति करने में सक्षम होना चाहते थे। मुझे कभी भी टैक्सन 1 या टैक्सन 2 खोज करने की आवश्यकता नहीं है, इसलिए मैंने निम्नलिखित अनुकूलन किए हैं। ऐसा करने के लिए एक कम हैकी तरीका हो सकता है, लेकिन यह मेरे लिए बहुत अच्छा काम करता है।

मैं

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 को

यह जोड़कर नई गुंजाइश इस्तेमाल किया /app/models/spree/product_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 

अब मैं उत्पादों को पुनः प्राप्त करने (जिसका अर्थ है मैं अभी भी कई taxons साथ खोजशब्द, आदि की आपूर्ति कर सकते साथ) मानक खोज सहायक का उपयोग कर सकते हैं:

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

यह मेरे लिए काम करता है और बहुत दर्द रहित महसूस करता है। हालांकि, मैं बेहतर विकल्पों के लिए खुला हूं।

संबंधित मुद्दे