2013-10-23 5 views
5

मैं उन सभी प्रोफाइल प्राप्त करना चाहता हूं जिनके विषय खोज खोजशब्द के साथ मेल खाते हैं। अभी मैं सभी प्रोफाइल लोड कर रहा हूँ। मुझे यह जानने की ज़रूरत है कि मैं इसे कैसे प्राप्त करूं। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।रेल में एसोसिएशन के माध्यम से कैसे खोजें 4

Profile.rb

has_many :categorizations 
has_many :subjects, through: :categorizations 

Subject.rb

has_many :categorizations 
has_many :profiles, through: :categorizations 

Categorization.rb

belongs_to :profile 
belongs_to :subject 

विचारों/खोज/index.html.erb

# search form 
<%= form_tag search_index_path, :method => 'get' do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "search", :name => nil %> 
<% end %> 

# search results 
<% @profiles.each do |profile| %> 
    <%= profile.name %> 
<% end %> 

search_controller.rb

def index 
    @profiles = Profile.with_translations('en').all 
end 
+1

आप खोज कीवर्ड मिलान बिल्कुल प्रोफ़ाइल विषय की आवश्यकता है? – Teddy

+0

बिलकुल ठीक नहीं है, अगर विषय के नाम से शब्द मिलान पर विषय नाम खोज परिणामों में प्रदर्शित होना चाहिए। – Murtza

उत्तर

4

इसमें जोड़ने के लिए कुछ full text searching रेल के साथ विचार है। आप खोज करते हैं, तो आप के बारे में पता आप वास्तव में एक पूरा टेक्स्ट "खोज" अपने डीबी, जो एसक्यूएल इंजन के आधार पर अलग है में क्वेरी प्रदर्शन कर रहे हैं कि होने की जरूरत है आप


MYSQL पूर्ण पाठ का उपयोग खोज

LIKE %{search}% तंत्र MYSQL की मूलभूत पूर्ण पाठ खोज सुविधा है, और मूल रूप से आपके डीबी में पूरे रिकॉर्ड के अंदर आपकी लक्षित क्वेरी को देखता है। इसका मतलब यह है कि अगर आपकी क्वेरी है इस:

SELECT * FROM `products` WHERE `name` LIKE '%alligator%' 

MYSQL मूल रूप से आपकी क्वेरी के लिए किसी भी संदर्भ के लिए पूरे "नाम" रिकॉर्ड के माध्यम से दिखेगा। परिणाम इस बात पर आधारित होंगे कि आपके रिकॉर्ड में "एलीगेटर" शब्द किसी भी हिस्से में है या नहीं। This reference के बारे में इस


PostgreSQL पूर्ण पाठ खोज

कारण मैंने लिखा क्योंकि psql वास्तव में अलग ढंग से करता है, और इसलिए क्वेरी आप प्रदान किया गया है केवल MySQL के लिए काम करेंगे इस पोस्ट है कुछ और बताते हैं ।Psql विभिन्न कार्यों पूरा टेक्स्ट खोज संभाल करने का एक बहुत कुछ है, लेकिन क्योंकि हम Heroku उपयोग करें, हम Textacular gem उपयोग करने के लिए ठीक से

यहाँ some ways PSQL handles full text searching काम कर यह सब पाने में कामयाब रहे:

Full text searching in PostgreSQL is based on the match operator @@, which returns true if a tsvector (document) matches a tsquery (query). It doesn't matter which data type is written first:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & 
rat'::tsquery; ?column? 
---------- t 

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat 
rat'::tsvector; ?column? 
---------- f 

As the above example suggests, a tsquery is not just raw text, any more than a tsvector > is. A tsquery contains search terms, which must be already-normalized lexemes, and may combine multiple terms using AND, OR, and NOT operators. (For details see Section 8.11.) There are functions to_tsquery and plainto_tsquery that are helpful in converting user-written text into a proper tsquery, for example by normalizing words appearing in the text. Similarly, to_tsvector is used to parse and normalize a document string. So in practice a text search match would look more like this:

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); ?column? 
---------- t Observe that this match would not succeed if written as 

SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat'); ?column? ---------- f


पूर्ण पाठ खोज सॉफ्टवेयर

पूर्ण पाठ खोज डीबी पर स्वाभाविक रूप से काफी महंगा है, खासकर अगर आपके पास खोज करने के लिए बहुत सारे डेटा हैं। यही कारण है कि sunspot solr या sphinx तरह समाधान मौजूद है - खोज डेटा से अपने आप दोनों सूचकांक & के लिए एक रास्ता प्रदान करने के लिए

आपके आवेदन काफी लोकप्रिय हो जाता है, तो आप इस तरह के रूप पूर्ण पाठ खोज प्रणालियों में से एक में निवेश करने के लिए, इच्छा हो सकती है these demonstrated by Heroku:

Heroku's full text search packages

+0

इस तरह के विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद लेकिन असल में मैं नया हूं रेलों के लिए और समझने की कोशिश कर रहा हूं कि मैं एसोसिएशन के माध्यम से कैसे खोजूं लेकिन मुझे आपका जवाब अच्छा विकल्प मिला है और मुझे इसे एक नए एप्लिकेशन पर आज़माएं। मैं रयान के रेलवे को देखकर सनस्पॉट के साथ कोशिश कर रहा हूं। – Murtza

+2

कोई समस्या नहीं! यदि आप रेल के लिए नए हैं, तो मैं वास्तव में "कट्टर" पूर्ण पाठ खोज सामग्री को अभी भी लागू करने की अनुशंसा नहीं करता (यह काम करने के लिए कुछ काम करता है)।मैं जो करना चाहता था वह आपको परिभाषित करने की कोशिश कर रहा था कि आप वास्तव में क्या करने की कोशिश कर रहे हैं; आपके बारे में सिर्फ एक प्रश्न प्राप्त करने के बजाय, आपके पास अपने कौशल को पॉलिश करते समय लागू करने के लिए एक फीचर-सेट तैयार होगा :) –

+1

कुछ दिनों के बाद अभ्यास मैं सफलतापूर्वक सनस्पॉट मणि का उपयोग कर रहा हूं। मार्गदर्शन के लिए धन्यवाद। मेरे पास एक सवाल है, क्या मैं ग्लोबल मणि के साथ सनस्पॉट का उपयोग कर सकता हूं? – Murtza

4
@profiles = Subject.where("name LIKE ?", "%#{params[:search]}%").map(&:profiles) 
+1

मुझे निम्नलिखित परिणाम मिलता है "MySQL 2 :: त्रुटि: अज्ञात कॉलम 'profile_id' 'फ़ील्ड सूची' में: 'विषयों' से प्रोफ़ाइल_आईडी चुनें (नाम '%%' नाम)" – Murtza

+0

@Murtza ने मेरा जवाब अपडेट किया। – x3qt

+0

अब मुझे "अपरिभाषित विधि 'model_name' मिल रहा है" और यह परिणाम में profile.name प्रिंट नहीं करता है। – Murtza

2

चेक अगर यह काम करता है।

@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search]) 
+0

नहीं, यह काम नहीं कर रहा है और मुझे निम्नलिखित त्रुटि दे रहा है "MySQL 2 :: त्रुटि: आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; मैन्युअल रूप से '%' '% के उपयोग के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाता है) लाइन 1 पर: 'प्रोफाइल' चुनें। * 'प्रोफाइल' से ''वर्गीकरण' पर 'वर्गीकरण' में शामिल हों।'profile_id' =' प्रोफाइल '। '' '' '' 'विषय' पर 'विषय' शामिल हों।' '' '' ' वर्गीकरण'.ububject_id' कहां (विषय% नाम% ''%) " – Murtza

+1

@Murtza संपादित। अपनी खोज क्वेरी – shiva

+0

के साथ 'पैरा [: search]' को भी प्रतिस्थापित करें, मैंने एक कीवर्ड "गणित" के साथ प्रतिस्थापित किया है लेकिन यह अभी भी एक ही त्रुटि दिखाता है। – Murtza

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