ruby on rails - inverse_of - Rails: has_many through con asociación polimórfica: ¿funcionará?
rails references (2)
Otra opción de esto es usar un patrón de herencia de tabla única (STI) o herencia de tabla múltiple (MTI), pero eso requiere una repetición de la tabla ActiveRecord / DB, pero esto puede ayudar a otros a encontrar esto que lo están diseñando por primera vez.
Aquí está el método STI en Rails 3+: su concepto Evenible se convierte en una clase y necesita una columna de type
(que los raíles rellena automáticamente para usted).
class Eventable < ActiveRecord::Base
has_one :event
end
Luego, sus otras dos clases heredan de Eventable en lugar de AR :: Base
class Meal < Eventable
end
class Workout < Eventable
end
Y su objeto de evento es básicamente el mismo, simplemente no polimórfico:
class Event < ActiveRecord::Base
belongs_to :person
belongs_to :eventable
end
Esto puede hacer que algunas de tus otras capas sean más confusas, si nunca antes has visto esto y no tienes cuidado. Por ejemplo, se puede acceder a un único objeto de Comidas en /meals/1
y /eventable/1
si pone ambos extremos disponibles en las rutas, y debe tener en cuenta la clase que está utilizando cuando extrae un objeto heredado ( sugerencia: el method puede ser muy útil si necesita anular el comportamiento predeterminado de los rieles)
Pero esta es una delincuencia mucho más clara de responsabilidades como escala de aplicaciones, en mi experiencia. Solo un patrón a considerar.
Una Person
puede tener muchos Events
y cada Event
puede tener un registro polimórfico Eventable
. ¿Cómo especifico la relación entre la Person
y el registro Eventable
?
Aquí están los modelos que tengo:
class Event < ActiveRecord::Base
belongs_to :person
belongs_to :eventable, :polymorphic => true
end
class Meal < ActiveRecord::Base
has_one :event, :as => eventable
end
class Workout < ActiveRecord::Base
has_one :event, :as => eventable
end
La pregunta principal se refiere a la clase Person
:
class Person < ActiveRecord::Base
has_many :events
has_many :eventables, :through => :events # is this correct???
end
¿Digo has_many :eventables, :through => :events
como lo hice anteriormente?
¿O debo deletrearlos todos de la siguiente manera?
has_many :meals, :through => :events
has_many :workouts, :through => :events
Si ves una manera más fácil de lograr lo que busco, ¡soy todo oídos! :-)
Tu tienes que hacer:
class Person < ActiveRecord::Base
has_many :events
has_many :meals, :through => :events, :source => :eventable,
:source_type => "Meal"
has_many :workouts, :through => :events, :source => :eventable,
:source_type => "Workout"
end
Esto te permitirá hacer esto:
p = Person.find(1)
# get a person''s meals
p.meals.each do |m|
puts m
end
# get a person''s workouts
p.workouts.each do |w|
puts w
end
# get all types of events for the person
p.events.each do |e|
puts e.eventable
end