मैं एक खोज प्रणाली लागू कर रहा हूं जो नाम, टैग और स्थान का उपयोग करता है। has_and_belongs_to_many
Server
और 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
सर्वर से संबंधित टैग कैसे हैं, मेरा मतलब है एसोसिएशन? –
दोनों में has_and_belongs_to_many है, और server_tags नामक एक जॉइन टेबल का उपयोग करें। –
"खत्म करें" से आपका मतलब नष्ट हो जाता है (यानी डेटाबेस से हटाएं)? –