खोज…


परिचय

सिंगल टेबल इनहेरिटेंस (एसटीआई) एक डिज़ाइन पैटर्न है जो कई मॉडल के डेटा को बचाने के विचार पर आधारित है जो सभी एक ही बेस मॉडल से विरासत में प्राप्त कर रहे हैं, डेटाबेस में एक ही टेबल में।

मूल उदाहरण

पहले हमें अपना डेटा रखने के लिए एक टेबल की आवश्यकता होती है

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :type # <- This makes it an STI

      t.timestamps
    end
  end
end

फिर कुछ मॉडल बनाते हैं

class User < ActiveRecord::Base
   validates_presence_of :password
   # This is a parent class. All shared logic goes here
end

class Admin < User
   # Admins must have more secure passwords than regular users
   # We can add it here
   validates :custom_password_validation
end

class Guest < User
   # Lets say that we have a guest type login. 
   # It has a static password that cannot be changed
   validates_inclusion_of :password, in: ['guest_password']
end

जब आप एक Guest.create(name: 'Bob') ActiveRecord इस type: 'Guest' साथ उपयोगकर्ता तालिका में प्रविष्टि बनाने के लिए इसका अनुवाद करेगा type: 'Guest'

जब आप रिकॉर्ड bob = User.where(name: 'Bob').first पुनः प्राप्त करते हैं bob = User.where(name: 'Bob').first लौटी वस्तु Guest का एक उदाहरण होगी, जिसे bob.becomes(User) साथ उपयोगकर्ता के रूप में जबरन व्यवहार किया जा सकता है

सबक्लास के बजाय सुपरक्लास के साझा किए गए हिस्से या मार्गों / नियंत्रकों से निपटने के दौरान यह सबसे उपयोगी हो जाता है।

कस्टम वंशानुक्रम स्तंभ

डिफ़ॉल्ट रूप से एसटीआई मॉडल वर्ग नाम type नाम के कॉलम में संग्रहीत किया जाता है। लेकिन बेस क्लास में inheritance_column वैल्यू को ओवरराइड inheritance_column इसका नाम बदला जा सकता है। उदाहरण के लिए:

class User < ActiveRecord::Base
  self.inheritance_column = :entity_type # can be string as well
end

class Admin < User; end

इस मामले में प्रवासन निम्नानुसार होगा:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :entity_type

      t.timestamps
    end
  end
end

जब आप Admin.create करते हैं, तो यह रिकॉर्ड entity_type = "Admin" साथ उपयोगकर्ता तालिका में सहेजा जाएगा।

प्रकार कॉलम के साथ और एसटीआई के बिना मॉडल को रेल करता है

एसटीआई को आमंत्रित किए बिना एक रेल मॉडल में type कॉलम होने को असाइन करके प्राप्त किया जा सकता है :_type_disabled to inheritance_column :

class User < ActiveRecord::Base
  self.inheritance_column = :_type_disabled
end


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow