2011-01-31 9 views
7

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

class Recipe < Post; end 
class Article < Post; end 
class Post < ActiveRecord::Base 
    #all the shared logic 
end 

ये सभी कक्षाएं मानक ////odels फ़ोल्डर में हैं। हालांकि, यह कोड, उदाहरण के लिए, जब मैं/articles/new पर जाता हूं, तो ActiveRecord :: स्टेटमेंट इनवाइड त्रुटि फेंकता है। त्रुटि है:

तालिका 'पदों'

किसी भी विचार कैसे इस सेट करने के लिए नहीं मिल सकता है?

+1

लेकिन क्या आपने 'पोस्ट' टेबल बनाई है? – Matt

उत्तर

9

आप मॉड्यूल का उपयोग क्यों नहीं करते?

module Features 
    def hello 
    p "hello" 
    end 
end 

class Recipe < ActiveRecord::Base 
    include Features 
end 

class Article < ActiveRecord::Base 
    include Features 
end 


Recipe.new.hello 
# => "hello" 

Article.new.hello 
# => "hello" 
+0

यह सही है। मैं रेल के लिए नया हूं और उन लोगों के बारे में नहीं जानता था। बस http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules पढ़ें और यह समझ में आता है। धन्यवाद! – weotch

13

रेल डिफ़ॉल्ट रूप से एकल टेबल Inhritance पैटर्न (बस इसके लिए गूगल) उपयोग कर रहा है, इसलिए जब आप एक मॉडल उपवर्गीकरण कर रहे हैं, सभी परिणामी मॉडल (इस मामले posts में) एक ही डेटाबेस तालिका का उपयोग करेगा। आप Post मॉडल में अपने सभी सामान्य तरीकों और सत्यापनों को और अन्य वर्गों में विशिष्ट लोगों को रख सकते हैं, लेकिन उन सभी वर्गों के पास एक-दूसरे के फ़ील्ड तक पहुंच होगी, क्योंकि वे एक ही टेबल साझा करते हैं (हालांकि यह एक बड़ी समस्या नहीं है)।

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

+0

क्यों एक स्पष्टीकरण शामिल करने के लिए धन्यवाद! – ifightcrime