Ruby on Rails
Vererbung einzelner Tabellen
Suche…
Einführung
Single Table Inheritance (STI) ist ein Entwurfsmuster, das auf der Idee basiert, die Daten mehrerer Modelle, die alle von demselben Basismodell erben, in einer einzigen Tabelle in der Datenbank zu speichern.
Grundlegendes Beispiel
Zuerst brauchen wir eine Tabelle, um unsere Daten zu speichern
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
Dann können wir einige Modelle erstellen
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
Wenn Sie ein Guest.create(name: 'Bob')
ausführen, übersetzt Guest.create(name: 'Bob')
dies, um einen Eintrag in der Tabelle Benutzer mit dem type: 'Guest'
zu erstellen.
Wenn Sie den Datensatz abrufen bob = User.where(name: 'Bob').first
das zurückgegebene Objekt eine Instanz von Guest
, die zwangsweise als Benutzer mit bob.becomes(User)
wird am nützlichsten, wenn es sich um gemeinsam genutzte Teilstrecken oder Routen / Controller der Oberklasse anstelle der Unterklasse handelt.
Benutzerdefinierte Vererbungsspalte
Standardmäßig wird der STI-Modellklassenname in einer Spalte namens type
gespeichert. Der Name kann jedoch durch Überschreiben des inheritance_column
in einer Basisklasse geändert werden. Z.B:
class User < ActiveRecord::Base
self.inheritance_column = :entity_type # can be string as well
end
class Admin < User; end
Die Migration in diesem Fall sieht wie folgt aus:
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
Wenn Sie Admin.create
, wird dieser Datensatz mit entity_type = "Admin"
in der Benutzertabelle entity_type = "Admin"
Schienenmodell mit Typsäule und ohne STI
Mit type
- Spalte in einem Rails - Modell ohne Aufruf STI durch die Zuordnung erreicht werden kann :_type_disabled
inheritance_column
:
class User < ActiveRecord::Base
self.inheritance_column = :_type_disabled
end