Has_Many: através da associação através de duas associações diferentes
-
23-09-2019 - |
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