Has_Many: a través de la asociación a través de dos asociaciones diferentes
-
23-09-2019 - |
Pregunta
Tengo cuatro clases de modelo:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
end
class Project < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class PersonalBlog < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class Event < ActiveRecord::Base
belongs_to :event_producer, :polymorphic => true
end
Quiero encontrar todos los eventos para un grupo en particular. Supongo que esto es un HAS_MANY: A través de la asociación, pero ¿cómo especifico un grupo que encuentra todos los eventos en los proyectos? o Personal_blogs de un grupo? Podría, por supuesto, especificar dos asociaciones y concatenar los resultados, pero luego tengo que volver a clasificar, limitar, condicionarse, etc. en Ruby, lo que podría ser una pesadilla de rendimiento con muchos eventos. Me gustaría hacer esto dentro de Activerecord para evitar tal pesadilla.
No hay solución correcta
Otros consejos
Podrías definir un método en la clase de grupo como el siguiente:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def events
Event.find(:all, :conditions => ['(type = ? AND event_producer_id IN (?)) OR (type = ? AND event_producer IN (?))', 'project', project_ids, 'personal_blog', personal_blog_ids])
end
end
Si no le gusta SQL como el anterior, siempre es posible usar la herencia de una sola mesa. Esta solución depende de tu Clases atributos y comportamiento, pero le permitirá usar una asociación "Has_Many a través".
¿Por qué no solo hacer?
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def all_events
projects.events + personal_blogs.events
end
end