ruby-on-rails - new - llaves foraneas ruby on rails
¿Cómo implementar la herencia de Active Record en Ruby on Rails? (3)
¿Cómo implementar herencia con registros activos?
Por ejemplo, quiero una clase Animal, clase Dog y clase Cat.
¿Cómo serían el modelo y el mapeo de la tabla de la base de datos?
ActiveRecord admite asignar jerarquías de herencia a una sola tabla ( herencia de tabla única . La tabla tendría un type
columna que almacena el nombre de la clase real y se usa para seleccionar otras columnas específicas de clase.
Es posible implementar la asignación de herencia de tablas múltiples, como se muestra here , pero esta forma particular no es portátil, AFAIK.
Modelos:
class Animal < ActiveRecord::Base; end
class Dog < Animal; end
class Cat < Animal; end
Migración:
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
Rails admite herencia de tabla única.
De los documentos de AR :
Active Record permite la herencia almacenando el nombre de la clase en una columna que por defecto se llama "tipo" (se puede cambiar sobrescribiendo Base.inheritance_column). Esto significa que una herencia se ve así:
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
Cuando se hace Firm.create (: name => "37signals"), este registro se guardará en la tabla de empresas con type = "Firm". A continuación, puede buscar esta fila nuevamente usando Company.find (: first, "name = ''37signals''") y devolverá un objeto Firm.
Si no tiene una columna de tipo definida en su tabla, la herencia de tabla única no se desencadenará. En ese caso, funcionará igual que las subclases normales sin magia especial para diferenciarlas o volver a cargar el tipo correcto con find.
Un buen tutorial está aquí: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/