references rails inverse_of has_and_belongs_to_many foreign belong association ruby-on-rails activerecord has-many-through polymorphic-associations

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