2011-04-23 10 views
5

के साथ meta_search का संयोजन करना मैंने एक रेल 3 वेबसाइट के लिए कुछ खोज-कार्यक्षमता के साथ एक छोटी सी समस्या में भाग लिया है।act_as_taggable_on

class Post < ActiveRecord::Base 
    acts_as_taggable 
end 

मैं acts_as_taggable_on उपयोग कर रहा हूँ थोड़ा आसान मेरी पोस्ट करने के लिए टैग जोड़ने बनाने के लिए: मैं एक साधारण Post मॉडल है कि इस तरह दिखता है। मैं एक पोस्ट में चिह्नित 'रेल' है और मैं निम्नलिखित करते हैं, सब कुछ ठीक काम करता है:

@posts = Post.tagged_with("rails") 

बात है, मैं भी पोस्ट के शीर्षक के लिए खोज करना चाहते हैं। जब मेरे पास 'हैलो वर्ल्ड' और टैग की गई 'रेल' शीर्षक वाली एक पोस्ट है, तो मैं 'हैलो' या 'रेल' की खोज करके इस पोस्ट को ढूंढने में सक्षम होना चाहता हूं। तो मैं tagged_with विधि acts_as_taggable_on के साथ संयोजन में शीर्षक कॉलम के लिए LIKE कथन चाहता हूं। where गुंजाइश काम नहीं करती है, क्योंकि यह OR के बजाय AND का उपयोग करती है।

मुझे आशा है कि meta_search समस्या को ठीक करेगा, लेकिन यह मेरे लिए काम नहीं कर रहा है। मैंने कई चीजों की कोशिश की। मैंने जो कोशिश की है उसके दो उदाहरण यहां दिए गए हैं:

@search = Post.search(:tagged_with_or_title_like => params[:search]) 
@search = Post.search(:title_like => params[:search], :tagged_with => params[:search]) 

यह सिर्फ 'टैग_with' को नहीं पहचानता है। यह मेरी पहली बार meta_search का उपयोग कर रहा है, इसलिए मैं यहां कुछ गलत कर रहा हूं। ;) मैंने कहीं पढ़ा है कि searchlogicacts_as_taggable_on के साथ संयोजन में काम किया, लेकिन चूंकि यह रेल 3 का समर्थन नहीं करता है, इसलिए मैं इसका उपयोग नहीं कर सकता।

मुझे आशा है कि यहां कोई व्यक्ति इस समस्या से मेरी सहायता कर सकता है। के साथ acts_as_taggable_on को गठबंधन करने के लिए कोई भी जानता है? या शायद meta_search के बिना समाधान पता है? इसके अलावा, अगर acts_as_taggable_on के लिए एक बेहतर विकल्प है जो meta_search के साथ काम करता है तो मुझे यह भी सुनना अच्छा लगेगा। :)

संपादित करें: मैं tagged_with या meta_search का उपयोग किए बिना काम कर समझ में आ गया। यह इस तरह से देखा:

Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search]) 

क्वेरी बनाया हास्यास्पद था, तो मैं एक अलग मार्ग की कोशिश की: acts_as_taggable_on और meta_search बिना। मैंने स्वयं एक टैग टेबल बनाया और has_and_belongs_to_many के साथ पोस्ट में इसे जोड़ा। मेरे पास अन्य टेबल नहीं होंगे जिन्हें टैग से कनेक्ट करने की आवश्यकता है, इसलिए यह मेरे लिए चाल करेगा। मैं दोनों टैग और शीर्षक खोज के लिए एक गुंजाइश बनाया:

scope :search, lambda { |search| select("DISTINCT posts.*").joins(:tags).where("posts.title LIKE ? OR tags.name = ?", "%"+search+"%", search) } 

अब मैं निम्न कर सकते हैं:

Post.search(params[:search]) 

यह बहुत अच्छा काम करता है और क्वेरी भी काफी अच्छा है। फिर भी, अगर कोई बेहतर तरीका जानता है: कृपया मुझे बताएं। Google के माध्यम से आने वाले लोगों के लिए यह सहायक भी हो सकता है।

+0

इस समस्या पर कोई खबर का आनंद? – CharlieMezak

+0

मैंने इस प्रश्न को अद्यतन किया कि मैंने इसे कैसे हल किया। मैं अंततः act_as_taggable और meta_search गिरा दिया। शायद आप सर्ज के जवाब का प्रयास कर सकते हैं। अगर यह काम करता है तो मैं इसे उत्तर के रूप में चिह्नित करूंगा। :) – RobinBrouwer

उत्तर

7
Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]}) 

+0

मैंने अभी परीक्षण किया है कि यह मेरी पुरानी परियोजना के अंदर काम करता है और यह काम करता है! तो मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं। धन्यवाद। :) – RobinBrouwer

1

मुझे लगता है कि आप जिस समाधान को देख रहे हैं वह डेटाबेस दृश्य को नए मॉडल के रूप में उपयोग कर रहा है।

आप जुड़ने वाले टेबल पोस्ट और टैग वाले व्यू बना सकते हैं।

फिर आप समस्याओं के बिना meta_search का उपयोग करके इसे खोज सकते हैं।