2009-10-21 5 views

Répondre

66

De l'AR docs:

Active Record permet par héritage stocker le nom de la classe dans une colonne que par défaut est nommé « type » (peut être changé en réécrivant Base.inheritance_column) . Cela signifie qu'un héritage qui ressemble à ceci:

class Company < ActiveRecord::Base; end 
class Firm < Company; end 
class Client < Company; end 
class PriorityClient < Client; end 

Lorsque vous Firm.create (: name => "37signals"), cet enregistrement sera enregistré dans la table des sociétés de type = « ferme ". Vous pouvez ensuite récupérer cette ligne en utilisant Company.find (: first, "name = '37signals'") et retournera un objet Firm.

Si vous ne disposez pas d'une colonne de type définie dans votre tableau, l'héritage de table unique ne sera pas déclenché. Dans ce cas, il fonctionnera comme sous-classes normales sans magie spéciale pour les différenciant ou en rechargeant le bon type avec trouver.

Un très bon tutoriel est ici: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

15

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 
6

ActiveRecord prend en charge des hiérarchies d'héritage de cartographie à une seule table (Single-table inheritance table serait avoir une colonne type qui stocke le nom d'un classe ctual et est utilisé pour sélectionner d'autres colonnes spécifiques à la classe.

Il est possible d'implémenter le mappage d'héritage multi-table, comme indiqué here, mais cette façon particulière n'est pas portable, AFAIK.