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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow