Ruby on Rails
Héritage de table unique
Recherche…
Introduction
L'héritage de table unique (STI) est un modèle de conception basé sur l'idée de sauvegarder les données de plusieurs modèles qui héritent tous du même modèle de base, dans une seule table de la base de données.
Exemple de base
Nous avons d'abord besoin d'un tableau pour contenir nos données
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
Puis laisse créer des modèles
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
Lorsque vous faites un Guest.create(name: 'Bob')
ActiveRecord le traduira pour créer une entrée dans la table Users avec le type: 'Guest'
.
Lorsque vous récupérez l'enregistrement bob = User.where(name: 'Bob').first
l'objet renvoyé sera d'abord une instance de l' Guest
, qui peut être traité de manière forcée en tant bob.becomes(User)
avec bob.becomes(User)
devient très utile lorsque vous traitez des partials partagés ou des routes / contrôleurs de la superclasse au lieu de la sous-classe.
Colonne d'héritage personnalisé
Par défaut, le nom de la classe de modèle STI est stocké dans un type
nommé colonne. Mais son nom peut être changé en substituant la valeur inheritance_column
dans une classe de base. Par exemple:
class User < ActiveRecord::Base
self.inheritance_column = :entity_type # can be string as well
end
class Admin < User; end
La migration dans ce cas ressemblera à ceci:
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
Lorsque vous effectuez Admin.create
, cet enregistrement sera enregistré dans la table users avec entity_type = "Admin"
Modèle Rails avec colonne de type et sans STI
Avoir type
colonne de type
dans un modèle Rails sans invoquer STI peut être obtenu en affectant :_type_disabled
à inheritance_column
:
class User < ActiveRecord::Base
self.inheritance_column = :_type_disabled
end