Pergunta

Eu tenho quatro classes 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

Quero encontrar todos os eventos para um determinado grupo. Eu acho que isso é um Has_Many: através da associação, mas como especificar um Has_Many no grupo que encontra todos os eventos nos projetos ou Personal_blogs de um grupo? Obviamente, eu poderia especificar duas associações e concatenar os resultados, mas tenho que re-classificar, limitar, condicionar etc. em Ruby, que poderia potencialmente ser um pesadelo de desempenho com muitos eventos. Eu gostaria de fazer isso no ActiveRecord para evitar um pesadelo.

Nenhuma solução correta

Outras dicas

Você pode definir um método na aula de grupo como a próxima:

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

Se você não gosta do SQL como o anterior, é sempre possível usar a herança de tabela única. Esta solução depende do seu atributos de aulas e comportamento, mas permitirá que você use uma associação "Has_Many através".

Por que não apenas fazer:

class Group < ActiveRecord::Base
  has_many :projects
  has_many :personal_blogs

  def all_events
    projects.events + personal_blogs.events
  end
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top