2014-06-20 3 views
5

मैं एक खोज प्रणाली लागू कर रहा हूं जो नाम, टैग और स्थान का उपयोग करता है। has_and_belongs_to_manyServer और Tag के बीच संबंध है। यहां मेरी खोज विधि वर्तमान में दिखाई दे रही है:ActiveRecord has_and_belongs_to_many: सभी दिए गए तत्वों के साथ मॉडल खोजें

def self.search(params) 
    @servers = Server.all 

    if params[:name] 
    @servers = @servers.where "name ILIKE ?", "%#{params[:name]}%" 
    end 

    if params[:tags] 
    @tags = Tag.find params[:tags].split(",") 
    # How do I eliminate servers that do not have these tags? 
    end 

    # TODO: Eliminate those that do not have the location specified in params. 
end 

टैग पैरामीटर केवल आईडी की अल्पविराम से अलग सूची है। मेरा प्रश्न if params[:tags] सशर्त ब्लॉक में एक टिप्पणी में कहा गया है। मैं उन सर्वरों को कैसे हटा सकता हूं जिनमें टैग निर्दिष्ट नहीं हैं?

बोनस प्रश्न: इसे गति देने का कोई तरीका? सभी फ़ील्ड वैकल्पिक हैं, और मैं विशेष रूप से पोस्टग्रेस का उपयोग कर रहा हूं।

संपादित

मैं यह करने के लिए एक रास्ता मिल गया है, लेकिन मैं यह बहुत धीमा चलेगा होगा विश्वास करने का कारण है। क्या मैंने ऐसा कुछ भी किया है जो मैंने किया है उससे तेज है? शायद डेटाबेस को काम करने का एक तरीका है?

tags = Tag.find tokens 
servers = servers.reject do |server| 
    missing_a_tag = false 

    tags.each do |tag| 
     if server.tags.find_by_id(tag.id).nil? 
      missing_a_tag = true 
     end 
    end 

    missing_a_tag 
end 
+0

सर्वर से संबंधित टैग कैसे हैं, मेरा मतलब है एसोसिएशन? –

+0

दोनों में has_and_belongs_to_many है, और server_tags नामक एक जॉइन टेबल का उपयोग करें। –

+0

"खत्म करें" से आपका मतलब नष्ट हो जाता है (यानी डेटाबेस से हटाएं)? –

उत्तर

5

if params[:tags] 
    tags_ids = params[:tags].split(',') 
    @tags = Tag.find(tags_ids) 
    @servers = @servers.joins(:tags).where(tags: {id: tags_ids}).group('servers.id').having("count(*) = #{tags_ids.count}") 
end 

के साथ सभी को देखते हुए टैग के साथ सर्वर को पुनः प्राप्त group(...).having(...) हिस्सा सभी अनुरोध किया टैग के साथ सर्वर का चयन करता है। यदि आप उन सर्वरों की तलाश में हैं जिनके पास कम से कम टैग में से एक है, तो इसे हटा दें।

इस समाधान के साथ, खोज एक SQL अनुरोध में किया जाता है, इसलिए यह आपके समाधान से बेहतर होगा।

+0

दुर्भाग्यवश यह ठीक से काम नहीं करता है। यह टैग के साथ सर्वर होने के बावजूद कोई सर्वर नहीं देता है। –

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