Come implementare l’ereditarietà del record attivo in Ruby on Rails?

Come implementare l’ereditarietà con i record attivi?

Ad esempio, voglio una class Animal, class Dog e class Cat.

Come sarebbe il modello e la mapping della tabella del database?

Rails supporta l’ereditarietà di tabelle singole.

Dai documenti AR :

Active Record consente l’ereditarietà memorizzando il nome della class in una colonna che per impostazione predefinita è denominata “tipo” (può essere modificata sovrascrivendo Base.inheritance_column). Ciò significa che un’eredità si presenta così:

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

Quando esegui Firm.create (: name => "37signals"), questo record verrà salvato nella tabella delle società con type = "Firm". È quindi ansible recuperare nuovamente questa riga utilizzando Company.find (: first, "name = '37signals'") e restituirà un object Firm.

Se non si dispone di una colonna di tipo definita nella tabella, l'ereditarietà a tabella singola non verrà triggersta. In tal caso, funzionerà proprio come normali sottoclassi senza magie speciali per differenziarle o ricaricare il tipo giusto con find.

Un buon tutorial è qui: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

Modelli:

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

Migrazione:

 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 supporta la mapping delle gerarchie di ereditarietà in una singola tabella (ereditarietà a tabella singola . La tabella dovrebbe avere un type colonna che memorizza il nome della class effettiva e viene utilizzato per selezionare altre colonne specifiche della class.

È ansible implementare la mapping dell’ereditarietà multi-tavolo, come mostrato qui , ma questo modo particolare non è portabile, AFAIK.