6

, अगर हम एक मॉडलरेल पर रूबी में, अगर हमने एक मॉडल "पशु" उत्पन्न किया, और अब "कुत्ता" रखना चाहते हैं, तो हमें यह कैसे करना चाहिए?

rails generate model animal name:string birthday:date 

उत्पन्न कहना और अब हम (जैसे कुत्ते और बिल्ली के रूप में) यह से विरासत के लिए अन्य मॉडल बनाने के लिए चाहते हैं, हम rails generate model फिर से उपयोग करना चाहिए या सिर्फ फाइलों खुद जोड़ सकता हूँ? अगर हम rails generate model का उपयोग करते हैं तो हम कैसे कुत्ते को पशु से वंचित होना चाहिए?

मुझे लगता है कि अगर हम मॉडल फ़ाइलों को जोड़ने के बजाय rails generate model का उपयोग करते हैं, तो हमारे लिए बनाई गई यूनिट टेस्ट फाइलें और स्थिरता फ़ाइलें भी होंगी। एक माइग्रेशन फ़ाइल भी जोड़ा जाता है, सिवाय इसके कि यह मोंगोडीबी का उपयोग कर रहा है, तो कोई माइग्रेशन फ़ाइल नहीं होगी।

उत्तर

2

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

तो:

script/generate model Dog 

तो बदलने के लिए:

class Dog < ActiveRecord::Base 

रहे हैं:

class Dog < Animal 

आप एक मॉडल है कि तब एकल तालिका भाग का उपयोग कर पशु से प्राप्त कर लेंगे आप जनरेट करना चाहते हैं स्क्रिप्ट/जेनरेट कॉल पर --skip-migrations निर्दिष्ट करना चाह सकता है (हालांकि आप माइग्रेशन को जोड़ने के लिए चाहते हैं जानवरों की मेज पर कुत्ते-विशिष्ट कॉलम और आपको जानवरों की तालिका में टाइपिंग स्ट्रिंग के type कॉलम को जोड़ने की आवश्यकता होगी)।

+2

लिए यह एक स्ट्रिंग की जरूरत है कॉलम ना 'पशु' में उपस्थित होने के लिए मेड 'टाइप'। – Swanand

+0

अच्छी कॉल, अपडेट किया गया। – Shadwell

7

Dog, Cat और अन्य उपवर्गों आप की योजना बना रहे Animal मॉडल से दूर वितरित हो जाते हैं के लिए नहीं जा रहे हैं, तो आप कर सकते हैं STI (Single Table Inheritance) पैटर्न यहाँ।

ऐसा करने के लिए, String कॉलम Animal पर जोड़ें। और फिर आप कर सकते हैं:

class Dog < Animal 
end 

class Cat < Animal 
end 

>> scooby = Dog.create(:name => 'Scooby', :date => scoobys_birthdate) 
=> #<Dog id: 42, date: "YYYY-MM-DD", type: "Dog"> 

मॉडल उत्पन्न करने के लिए Dog

$ script/generate model Dog --skip-migration 

और फिर (आमतौर पर app/models/dog.rb) बदलने के लिए:

class Dog < ActiveRecord::Base 

class Dog < Animal 
+0

मैं देखता हूं ... इस वर्ग के साथ अतिरिक्त संपत्ति है, जैसे 'fur_color: string'? यह 'जेनरेट' और टेबल को कैसे प्रभावित करता है? –

+0

यदि आप कोई नया कॉलम जोड़ते हैं, तो 'fur_color' कहें जैसा कि आप कहते हैं, यह सभी उप-वर्गों के लिए उपलब्ध होगा। उदाहरण के लिए, यह हमेशा समझ में नहीं आता है। आपके पास 'वर्ग सांप Swanand

+4

'- पैरेंट' ध्वज निर्दिष्ट करके मॉडल उत्पन्न करते समय आप सुपरक्लास को परिभाषित कर सकते हैं। [यह] देखें (http://stackoverflow.com/a/14569424) पोस्ट। यह मैंने जो भी देखा है, उससे कोई भी माइग्रेशन उत्पन्न नहीं करेगा। –