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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow