के साथ एक पॉलिमॉर्फिक एआर संबंध को फ़्लैटन करना मैं लोगों को अनुदान के लिए आवेदन करने की अनुमति देने के लिए रेल 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" }
तो, मेरे पास कुछ प्रश्न हैं।
- लक्ष्य अंतर्निहित (उत्तरदायी) प्रकार के बावजूद सभी उत्तरों के लिए एकल प्रश्न समाधान प्रदान करना है। मैंने पहले कभी ऐसा कुछ सेट नहीं किया है। क्या यह समस्या के लिए एक दृश्य दृष्टिकोण की तरह प्रतीत होता है? क्या आप झुर्रियों को देख सकते हैं जो मैं नहीं कर सकता? वैकल्पिक/सुझाव/आदि। स्वागत है।
मुश्किल भाग, जैसा कि मैंने इसे देखा, मैपिंग है। मेरी योजना क्षेत्रों है कि अनुक्रमण विकल्प की जरूरत के लिए जवाब मॉडल में स्पष्ट मैपिंग डाल करने के लिए, और बस जाने डिफ़ॉल्ट मैपिंग बाकी की देखभाल है:
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") टायर/ईएस गतिशील मैपिंग पर वापस आ जाएगा? (क्या मुझे स्पष्ट रूप से उपयोग किए जाने वाले प्रत्येक फ़ील्ड को मानचित्र बनाना चाहिए?)
अग्रिम धन्यवाद। अगर मैं और अधिक विशिष्ट हो तो कृपया मुझे बताएं।