मैं 4.2 रेल के लिए एक रेल एप्लिकेशन पोर्टिंग कर रहा हूँ। इस रेल ऐप में एसोसिएशन में कुछ जटिल मैनुअल एसक्यूएल कोड शामिल हैं - आंशिक रूप से डीबी ऑप्टिमाइज़ेशन (उदाहरण के लिए जॉइन के बजाय उप-चयन) के कारण, आंशिक रूप से लेखन (रेल 3.0) के समय कोई व्यवहार्य विकल्प नहीं है, आंशिक रूप से निश्चित रूप से ज्ञान की कमी के कारण (मुझे उम्मीद है, कम से कम - यह हल करना आसान होगा)।Porting जटिल has_many रिश्तों रेल के लिए> 4.1 (finder_sql के बिना)
उदाहरण: एक आंतरिक संदेश वर्ग। संदेशों को उपयोगकर्ताओं के बीच भेजा जा सकता है (आंतरिक मैसेज के प्राप्तकर्ता, और संदेशों के 'हटाना', InternalMessagesRecipients में संग्रहीत हैं, क्योंकि कई हो सकते हैं) और उन्हें पढ़ा जा सकता है, जवाब दिया जा सकता है और हटाया जा सकता है। संघ इस तरह दिखता है:
class User < AR::Base
has_many :internal_messages,
:finder_sql => "SELECT DISTINCT(internal_messages.id), internal_messages.* FROM internal_messages " +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}',
:counter_sql => 'SELECT count(DISTINCT(internal_messages.id)) FROM internal_messages ' +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}'
# ...
end
महत्वपूर्ण हिस्सा "या" अंत में खंड है - यह संघ मैं दोनों प्राप्त और संदेश है, जो उपयोगकर्ता तालिका अलग से साथ शामिल हो गए हैं भेजा प्राप्त करना चाहते हैं के साथ:
has_many :sent_messages, -> { where(:sender_deleted_at => nil) }, :class_name => 'InternalMessage', :foreign_key => 'sender_id' #, :include => :sender
has_many :internal_messages_recipients, :foreign_key => 'recipient_id'
has_many :rcvd_messages, :through => :internal_messages_recipients, :source => :internal_message, :class_name => 'InternalMessage'
एक आंतरिक संदेश के बाद कई प्राप्तकर्ता हो सकते हैं (और प्रेषक को भी भेजा जा सकता है)।
प्रश्न: मैं इस finder_sql
को रेल 4.2 संगत has_many
परिभाषा में कैसे पोर्ट करूं?
बेशक, इस अवर है अगर आप परिणामों का Memoization चाहते हैं, खासकर इसलिए वे 'रीलोड' के साथ काम करते हैं। विदेशी संबंधों के बिना इन रिश्तों को बनाए रखने के लिए रेल पाने का कोई तरीका है? – duane