2013-01-14 16 views
5

के साथ एक पॉलिमॉर्फिक एआर संबंध को फ़्लैटन करना मैं लोगों को अनुदान के लिए आवेदन करने की अनुमति देने के लिए रेल 3 आवेदन के साथ काम कर रहा हूं। हम एक खोज इंजन के रूप में Elasticsearch/टायर का उपयोग कर रहे हैं।Elasticsearch/टायर

दस्तावेज़, उदाहरण के लिए, अनुदान प्रस्ताव, अलग-अलग प्रकार के कई उत्तरों, जैसे संपर्क जानकारी या निबंध से बने होते हैं। एआर में, (सामान्य रूप में संबंधपरक डीबीएस) यदि आप एक बहुरूपी "has_many" संबंध सीधे निर्दिष्ट कर सकते हैं नहीं है, इसलिए बजाय:

class Document < ActiveRecord::Base 
    has_many :answerings 
end 

class Answering < ActiveRecord::Base 
    belongs_to :document 
    belongs_to :question 
    belongs_to :payload, :polymorphic => true 
end 

"पेलोड" व्यक्तिगत जवाब प्रकार के लिए मॉडल हैं: संपर्क, आख्यान, एकाधिक विकल्प, और शीघ्र। (इन मॉडलों के तहत namespaced कर रहे हैं "जवाबदेह।")

class Answerable::Narrative < ActiveRecord::Base 
    has_one :answering, :as => :payload 
    validates_presence_of :narrative_content 
end 

class Answerable::Contact < ActiveRecord::Base 
    has_one :answering, :as => :payload 
    validates_presence_of :fname, :lname, :city, :state, :zip... 
end 

वैचारिक रूप से, विचार एक जवाब एक आंसरिंग से बना है (एक टेबल में शामिल होने की तरह काम करता है, सभी प्रश्नों के उत्तर के लिए मेटाडाटा आम भंडार) और एक जवाबदेह (जो उत्तर की वास्तविक सामग्री को संग्रहीत करता है।) यह डेटा लिखने के लिए बहुत अच्छा काम करता है। खोज और पुनर्प्राप्ति, इतना नहीं।

मैं खोज और पढ़ने के लिए अपने डेटा के अधिक से अधिक प्रतिनिधित्व का खुलासा करने के लिए टायर/ईएस का उपयोग करना चाहता हूं। एक सामान्य टायर सेटअप में, मैं (ए) उत्तर के लिए एक सूचकांक के साथ हवा (और) narratives, संपर्क, एकाधिक विकल्प, आदि के लिए अलग सूचकांक के साथ हवा जाएगा। इसके बजाए, मैं केवल दस्तावेजों और उत्तरों को स्टोर करना चाहता हूं, संभवतः माता-पिता/बच्चे के रूप में। उत्तर इंडेक्स उत्तर से डेटा (आईडी, question_id, update_at ...) और उत्तरदायी (fname, lname, ईमेल ...) से विलय करेगा। इस तरह, मैं एक इंडेक्स से उत्तर खोज सकता हूं, प्रकार, प्रश्न_आईडी, document_id इत्यादि द्वारा फ़िल्टर कर सकता हूं। अपडेट उत्तर से ट्रिगर किए जाएंगे, लेकिन प्रत्येक उत्तर देने से इसकी उत्तरदायी जानकारी मिल जाएगी। मैं अपने खोज इंजन इनपुट टेम्पलेट करने के लिए आरएबीएल का उपयोग कर रहा हूं, इसलिए यह काफी आसान है।

Answering.find(123).to_indexed_json # let's say it's a narrative 
=> { id: 123, question_id: 10, :document_id: 24, updated_at: ..., updated_by: [email protected], narrative_content: "Back in the day, when I was a teenager, before I had...", answerable_type: "narrative" } 

तो, मेरे पास कुछ प्रश्न हैं।

  1. लक्ष्य अंतर्निहित (उत्तरदायी) प्रकार के बावजूद सभी उत्तरों के लिए एकल प्रश्न समाधान प्रदान करना है। मैंने पहले कभी ऐसा कुछ सेट नहीं किया है। क्या यह समस्या के लिए एक दृश्य दृष्टिकोण की तरह प्रतीत होता है? क्या आप झुर्रियों को देख सकते हैं जो मैं नहीं कर सकता? वैकल्पिक/सुझाव/आदि। स्वागत है।
  2. मुश्किल भाग, जैसा कि मैंने इसे देखा, मैपिंग है। मेरी योजना क्षेत्रों है कि अनुक्रमण विकल्प की जरूरत के लिए जवाब मॉडल में स्पष्ट मैपिंग डाल करने के लिए, और बस जाने डिफ़ॉल्ट मैपिंग बाकी की देखभाल है:

    mapping do 
        indexes :question_id, :index => :not_analyzed 
        indexes :document_id, :index => :not_analyzed 
        indexes :narrative_content, :analyzer => :snowball 
        indexes :junk_collection_total, :index => :not_analyzed 
        indexes :some_other_crazy_field, :index 
        [...] 
    

    अगर मैं कुछ क्षेत्र के लिए एक मानचित्रण निर्दिष्ट नहीं करते हैं, (कहें, "fname") टायर/ईएस गतिशील मैपिंग पर वापस आ जाएगा? (क्या मुझे स्पष्ट रूप से उपयोग किए जाने वाले प्रत्येक फ़ील्ड को मानचित्र बनाना चाहिए?)

अग्रिम धन्यवाद। अगर मैं और अधिक विशिष्ट हो तो कृपया मुझे बताएं।

उत्तर

0

इंडेक्सिंग इस बारे में जाने का सही तरीका है। इंडेक्सिंग फ़ील्ड नामों के साथ, आप विधियों के परिणामों को इंडेक्स कर सकते हैं।

mapping do 
    indexes :payload_details, :as => 'payload_details', :analyzer => 'snowball',:boost => 0 
end 

def payload_details 
    "#{payload.fname} #{payload.lname}" #etc. 
end 

अनुक्रमित मूल्य एक बतख प्रकार हो जाता है, इसलिए यदि आप सूचकांक मूल्यों है कि आप अपने ध्यान में रखते हुए संदर्भ के सभी, डेटा उपलब्ध हो जाएगा। यदि आप किसी विशेषता को एक्सेस करते हैं जो अनुक्रमित आइटम के मॉडल पर अनुक्रमित नहीं है, तो यह ActiveRecord से उदाहरण ले जाएगा, यदि आप किसी संबंधित मॉडल की विशेषता तक पहुंचते हैं, तो मुझे पूरा यकीन है कि आपको संदर्भ त्रुटि मिलती है, लेकिन डायनामिक खोजक हो सकता है कब्जा।

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

  • कोई संबंधित समस्या नहीं^_^