2012-02-11 8 views
5

मुझे लगता है कि मैं इस सामग्री के साथ कई मॉडल में शामिल कर रहा हूँ एक मॉड्यूल है। यही कारण है कि लाइन हमेशा क्वेरीहमेशा बेस क्लास का उपयोग कैसे करें और रेल में एसटीआई को अनदेखा करें? जब तक मैं एसटीआई का उपयोग शुरू किया</p> <pre><code>self.class.find_by_foo(bar) </code></pre> <p>सब कुछ ठीक था:

select * from table where foo=bar" 

और नहीं

select * from table where foo=bar AND type="Whatever" 

वहाँ से बचने के लिए एक आसान तरीका है उत्पन्न करनी चाहिए?

मैं दो समाधानों के बावजूद। जब तक मैं ActiveRecord::Base से पहले सर्वोच्च वर्ग खोजने या हाथ से क्वेरी चलाने वर्ग पदानुक्रम ऊपर चलना, जैसे:

self.class.find_by_sql("select * from #{self.class.table_name} where foo=bar") 

मैं या तो समाधान पसंद नहीं है। क्या कोई बेहतर है?

klass = self.class 
self.class.ancestors.each do |k| 
    if k == ActiveRecord::Base 
    break # we reached the bottom of this barrel 
    end 
    if k.is_a? Class 
    klass = k 
    end 
end 

उत्तर

2

तक कोई बेहतर जवाब है, मैं एसटीआई श्रृंखला का आधार वर्ग खोजने के लिए इस कोड का उपयोग कर रहा

self.class.base_class.find_by_foo(bar) 

हालांकि, इसके बाद के संस्करण अपने उदाहरण में, आप आधार वर्ग का उपयोग करने की आवश्यकता नहीं है। तुम सिर्फ सही तालिका नाम निम्नलिखित और रेल पता चल जाएगा कर सकते हैं:

self.class.where(:foo => bar) 

वास्तव में बहुत कम मामले हैं जब आप आधार वर्ग का उपयोग करने की जरूरत है।

19

सबसे पहले, आप हमेशा विधि base_class साथ आधार वर्ग के लिए प्राप्त कर सकते हैं:

+0

रेल में 4 'self.class' अप्रत्याशित रूप से वस्तुओं माता पिता वर्ग,, के रूप में अपवादित, मॉडल वर्ग लौटे रेल 5' self.class' रिटर्न में। माता-पिता वर्ग प्राप्त करने के लिए 'self.class.base_class' का उपयोग किया जा सकता है। – Kris