Ruby on Rails
सिंगल टेबल इनहेरिटेंस
खोज…
परिचय
सिंगल टेबल इनहेरिटेंस (एसटीआई) एक डिज़ाइन पैटर्न है जो कई मॉडल के डेटा को बचाने के विचार पर आधारित है जो सभी एक ही बेस मॉडल से विरासत में प्राप्त कर रहे हैं, डेटाबेस में एक ही टेबल में।
मूल उदाहरण
पहले हमें अपना डेटा रखने के लिए एक टेबल की आवश्यकता होती है
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