Comment mettre en œuvre l'héritage avec des enregistrements actifs?
Par exemple, je veux un animal de classe, un chien de classe et un chat de classe.
Comment le modèle et la cartographie de la table de base de données seraient-ils?
Les rails soutiennent l'héritage de la table unique.
Du AR Docs :
Enregistrement actif permet l'héritage en stockant le nom de la classe dans une colonne que par défaut est nommée "Type" (peut être modifiée par écrasement de base.Column). Cela signifie qu'un héritage ressemblant à ceci:
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
Lorsque vous faites ferme.create (: Nom => "37Signals"), cet enregistrement sera enregistré dans la table des entreprises avec type = "entreprise". Vous pouvez ensuite récupérer cette ligne à nouveau à l'aide de la société.Find (: d'abord, "Nom =" 37Signals ") et il retournera un objet ferme.
Si vous n'avez pas de colonne de type définie dans votre table, l'héritage à table unique ne sera pas déclenché. Dans ce cas, cela fonctionnera comme des sous-classes normales sans magie spéciale pour différencier les autres ou recharger le type de bon type à la recherche.
Un très bon tutoriel est ici: http://juixe.com/techknow/index.php/2006/06/03/Rails-single-table-Inherittance/
Des modèles:
class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
Migration:
class CreateAnimals < ActiveRecord::Migration
def self.up
create_table :animals do |t|
# Other attributes...
t.string :type
end
end
def self.down
drop_table :animals
end
end
Activerecord soutient la cartographie des héritiers d'héritage à une table unique ( héritage de table . La table aurait une colonne type
qui stocke le nom de la classe actuelle et permet de sélectionner d'autres colonnes spécifiques à une classe.
Il est possible de mettre en œuvre la mappage de héritage multi-table, comme indiqué ici , mais cette manière particulière n'est pas portable, Afaik.