web-dev-qa-db-fra.com

Comment implémenter l'héritage actif d'enregistrement dans Ruby sur rails?

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?

38
andrisetiawan

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/

66
Toby Hede

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
16

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.

7
elder_george