39 votes

Comment mettre en œuvre l'héritage Active Record en Ruby on Rails ?

Comment mettre en œuvre l'héritage avec des enregistrements actifs ?

Par exemple, je veux une classe Animal, une classe Chien et une classe Chat.

Comment serait le modèle et le mappage des tables de la base de données ?

67voto

Toby Hede Points 22128

Rails supporte l'héritage d'une seule table.

De la Docs AR :

Active Record permet l'héritage en en stockant le nom de la classe dans une colonne qui, par défaut, est nommée "type". (peut être modifiée en écrasant Base.inheritance_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 Firm.create(:name => "37signals"), cet enregistrement sera enregistré dans la table des entreprises avec le type = "Firm". Vous pouvez ensuite récupérer cette ligne en utilisant Company.find(:first, "name = '37signals'"), qui renverra un objet Firm.

Si vous n'avez pas de colonne de type définie dans votre table, l'héritage ne sera pas déclenché. Dans Dans ce cas, il fonctionnera exactement comme les normales, sans magie particulière pour les différencier ou recharger le bon type avec find.

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

16voto

Modèles :

class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end

La 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

7voto

elder_george Points 6395

ActiveRecord supporte le mappage des hiérarchies d'héritage à une seule table( Héritage à table unique . Le tableau aurait une colonne type qui stocke le nom de la classe actuelle 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é aquí mais cette méthode particulière n'est pas portable, AFAIK.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X