Ruby on Rails
Overerving van een enkele tabel
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