Hola a todos, tengo algo de un requisito interesante para mi proyecto. Necesito una relación has_one
donde sea una clase o la otra, pero sin herencia. Podría salirme con la herencia si fuera la única forma, pero los dos registros asociados tienen datos completamente diferentes y no están relacionados en absoluto.RoR: has_one "or the other"? (O, polimorfismo sin la herencia.)
Lo que necesito averiguar es algo como lo siguiente.
# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
# related in either data or implementation.
class Foo < ActiveRecord::Base
# Attributes: id, name, value
has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
# Could really use an :object_type for has_one here...
end
class Bar < ActiveRecord::Base
# Attributes: name,...
end
class Baz < ActiveRecord::Base
# Attributes: name,...
end
Dónde Foo
tiene una asignación, de tipo ya sea Bar
o Baz
; solo comparten una columna común, así que quizás pueda hacer un objeto principal a partir de eso. Sin embargo, si los hago heredar de un objeto común (cuando los datos que contienen realmente son naranjas y manzanas) ¿debo hacer una tabla para el registro? ¿Puedo quizás salirse con la suya si el registro es un registro abstracto, pero los niños no?
Supongo que ahora puede ver mi dificultad. Soy bastante nuevo en RoR pero me encanta hasta ahora. Estoy seguro de que hay una forma de evitar esto, pero seré condenado si no puedo descubrir qué es.
Buen punto, sin embargo, a veces no se nos concede plena libertad sobre cómo se diseñan las bases de datos o cómo se relacionan los datos. Especialmente cuando se trabaja con un producto o biblioteca producida por otra persona. Las dos relaciones has_one funcionarán bien; gracias por tu visión. –