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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top