2009-09-25 18 views
6

में बहुरूपी संघों के उत्सुक लोड हो रहा है यह मेरा पहला रेल उपयोग कर रहा है और अगर यह एक एक SQL क्वेरी में एक बहुरूपी सहयोग दिया है लोड करने के लिए संभव है मैं सोच रहा था? मॉडल और उन दोनों के बीच संघों पर्याप्त बुनियादी रहे हैं: एक एसेट मॉडल/तालिका एक सामग्री का उल्लेख कर सकते (या तो एक छवि, पाठ, या ऑडियो) एक बहुरूपी संघ के माध्यम से, यानीActiveRecord

 
class Asset < ActiveRecord::Base 
    :belongs_to :content, :polymorphic => true 
end 

और छवि, पाठ, ऑडियो इस तरह परिभाषित कर रहे हैं:

 
class Image < ActiveRecord::Base 
    :has_one :asset, :as => :content 
end 

जब मैं एक छवि लोड करने का प्रयास है, इस तरह कहते हैं:

Image.first(
     :conditions => {:id => id}, 
     :include => :asset 
)

यह दो प्रश्नों, एक छवि को पुनः प्राप्त करने और एक अन्य एक को पुनः प्राप्त करने को निर्दिष्ट करता है sset (FYI, यह तब भी होता है जब मैं :joins निर्दिष्ट करता हूं)। मेरी समझ के आधार पर, ActiveRecord ऐसा करता है क्योंकि यह नहीं जानता कि छवि और संपत्ति के बीच एक-से-एक संबंध है। क्या एक बार में शामिल होने और दो वस्तुओं को पुनः प्राप्त करने का कोई तरीका है? मैंने एक कस्टम चयन के साथ जुड़ने का भी प्रयास किया है, लेकिन मैं ActiveRecord मॉडल मैन्युअल रूप से और उनके संगठनों को बनाने के लिए समाप्त होता हूं।

ActiveRecord यह करने के लिए एक तरीका प्रदान करता है?

उत्तर

1

रेल स्रोत मुझे पता चला है कि आप एक या तो का चयन करें, की स्थिति या आदेश खंड में वर्तमान मॉडल के अलावा किसी अन्य तालिका का हवाला में शामिल होने के लिए मजबूर कर सकते के माध्यम से खुदाई करने के बाद।

तो, अगर मैं एसेट मेज पर एक आदेश निर्दिष्ट करें:

 
Image.first(
     :conditions => {:id => id}, 
     :include => :asset, 
     :order => "asset.id" 
) 

जिसके परिणामस्वरूप एसक्यूएल एक छोड़ दिया बाहरी उपयोग करेगा में शामिल होने और एक बयान में सब कुछ। मैं एक आंतरिक जुड़ाव पसंद करता, लेकिन मुझे लगता है कि यह अब के लिए करेगा।

1

मैं इस मुद्दे को अपने आप के खिलाफ भाग गया। ActiveRecord यह Rubyists के लिए आसान बनाने के अंत में (जो भी सब भी एसक्यूएल से परिचित नहीं हो सकता है) की ओर अधिक leans डेटाबेस के साथ इंटरफेस करने, की तुलना में यह अनुकूलित डेटाबेस कॉल के साथ करता है। अपने प्रदर्शन को बेहतर बनाने के लिए आपको निम्न स्तर (उदा। डीबीआई) पर डेटाबेस से बातचीत करनी पड़ सकती है। ActiveRecord का उपयोग निश्चित रूप से प्रभावित करेगा कि आप अपनी स्कीमा कैसे डिज़ाइन करते हैं।

SQL दक्षता के लिए इच्छा मुझे अन्य ORMs का उपयोग कर के बारे में सोच मिला है। मुझे अपनी ज़रूरतों के अनुरूप कोई नहीं मिला है। यहां तक ​​कि जो लोग एसक्यूएल स्वयं (जैसे सीक्वेल) की तरफ बढ़ते हैं, वे भी भारी रूबी एपीआई रखते हैं। मैं रुबी जैसी एपीआई के बिना सामग्री और मैन्युअल रूप से अपने टी-एसक्यूएल लिख रहा हूं। एक ओआरएम के साथ मैं जो वास्तविक लाभ हूं, वह एम है, ऑब्जेक्ट्स में परिणाम सेट (एक या अधिक टेबलों) का मानचित्रण करना।

+0

मैं आमतौर पर ओआरएम का उपयोग नहीं करता हूं। यह एक अमूर्त है कि मैंने बिना ठीक किया है। – Mario

1

(यह के लिए रेल 3 वाक्य रचना है।)

MetaWhere जटिल प्रश्न है कि ActiveRecord के सामान्य डोमेन आसान और माणिक तरह से बाहर के हैं बनाने के लिए एक भयानक मणि है। (@wayne:। यह बाहरी रूप में अच्छी तरह जुड़ जाता है का समर्थन करता है)

https://github.com/ernie/meta_where

बहुरूपी मिलती है एक छोटे से जटिल काम कर रहे हैं।यहां बताया गया है मैं मेरा MetaWhere के साथ किया था:

Image.joins(:asset.type(AssetModel)).includes(:asset) 

वास्तव में, मैं अपने बहुरूपी-संघ-होने कक्षा में एक सुविधा विधि बनाया:

def self.join_to(type) 
    joins(:asset.type(type)).includes(:asset) 
    end 

तो यह हमेशा & उत्सुक लोड एक विशेष प्रकार क्वेरी करेगा संपत्ति का मैंने इसे एक प्रश्न में कई प्रकार के शामिल होने के साथ मिश्रण करने की कोशिश नहीं की है। चूंकि बहुरूपता विभिन्न तालिकाओं को संदर्भित करने के लिए एक ही विदेशी कुंजी का उपयोग करके काम करती है, एसक्यूएल स्तर पर आपको इसे अलग-अलग जोड़ों के रूप में निर्दिष्ट करना होगा क्योंकि कोई केवल एक तालिका में शामिल होता है।

यह केवल ActiveRecord 3 के साथ काम करता है क्योंकि आपके पास AREL की अद्भुत शक्ति तक पहुंच है।