Zoeken…


Invoering

Single Table Inheritance (STI) is een ontwerppatroon dat is gebaseerd op het idee om de gegevens van meerdere modellen die allemaal van hetzelfde basismodel zijn over te nemen, in een enkele tabel in de database op te slaan.

Basis voorbeeld

Eerst hebben we een tabel nodig om onze gegevens te bewaren

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

Laten we vervolgens enkele modellen maken

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

Wanneer u een Guest.create(name: 'Bob') uitvoert, vertaalt ActiveRecord dit om een vermelding in de tabel Gebruikers te maken met het type: 'Guest' .

Wanneer u het record bob = User.where(name: 'Bob').first ophaalt, is het geretourneerde object eerst een instantie van Guest , die met kracht kan worden behandeld als een gebruiker met bob.becomes(User)

wordt is het meest nuttig bij het omgaan met gedeelde partities of routes / controllers van de superklasse in plaats van de subklasse.

Aangepaste erfeniskolom

Standaard wordt de STI-modelklasse naam opgeslagen in een kolom met de naam type . Maar de naam kan worden gewijzigd door de waarde inheritance_column in een basisklasse te overschrijven. bv:

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

class Admin < User; end

Migratie ziet er in dit geval als volgt uit:

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

Wanneer u Admin.create , wordt dit record opgeslagen in de gebruikerstabel met entity_type = "Admin"

Rails model met typekolom en zonder STI

Met type kolom in een Rails model zonder beroep STI kan worden verkregen door het toewijzen :_type_disabled tot inheritance_column :

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow