2009-10-21 11 views
36

सक्रिय रिकॉर्ड के साथ विरासत को कैसे कार्यान्वित करें?रेल पर रूबी में सक्रिय रिकॉर्ड विरासत को कैसे कार्यान्वित करें?

उदाहरण के लिए, मुझे एक वर्ग पशु, कक्षा कुत्ता, और कक्षा बिल्ली चाहिए।

मॉडल और डेटाबेस तालिका मानचित्रण कैसे होगा?

+5

आप एक उत्तर स्वीकार करना चाहते हैं –

उत्तर

66

रेल एकल तालिका विरासत का समर्थन करता है।

AR docs से:

सक्रिय रिकॉर्ड एक कॉलम में वर्ग के नाम संग्रहण कि द्वारा डिफ़ॉल्ट "प्रकार" नाम दिया गया है द्वारा विरासत की अनुमति देता है (बदला जा सकता है Base.inheritance_column अधिलेखन के द्वारा) । यह मतलब यह है कि इस तरह की तलाश में एक विरासत:

class Company < ActiveRecord::Base; end 
class Firm < Company; end 
class Client < Company; end 
class PriorityClient < Client; end 

आप Firm.create करते हैं (: नाम => "37signals"), इस रिकॉर्ड प्रकार = "फर्म के साथ कंपनियों तालिका में सहेजा जाएगा "। फिर आप कंपनी का उपयोग कर इस पंक्ति को फिर से प्राप्त कर सकते हैं। (पहले, "नाम = '37signals')) और यह एक फर्म ऑब्जेक्ट लौटाएगा।

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

एक बहुत अच्छी ट्यूटोरियल यहाँ है: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

15

मॉडल:

class Animal < ActiveRecord::Base; end 
class Dog < Animal; end 
class Cat < Animal; end 

प्रवासन:।

class CreateAnimals < ActiveRecord::Migration 
    def self.up 
    create_table :animals do |t| 
     # Other attributes... 
     t.string :type 
    end 
    end 

    def self.down 
    drop_table :animals 
    end 
end 
6

ActiveRecord एक एकल तालिका करने के लिए मानचित्रण विरासत पदानुक्रम का समर्थन करता है (Single-table inheritance टेबल होगा एक कॉलम type है जो एक का नाम संग्रहीत करता है ctual वर्ग और अन्य वर्ग-विशिष्ट कॉलम का चयन करने के लिए प्रयोग किया जाता है।

मल्टी-टेबल विरासत मानचित्रण को लागू करना संभव है, जैसा कि here दिखाया गया है, लेकिन यह विशेष तरीका पोर्टेबल नहीं है, AFAIK।

संबंधित मुद्दे