has_many: attraverso l'associazione attraverso due diverse associazioni
-
23-09-2019 - |
Domanda
Ho quattro classi del modello:
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
Voglio trovare tutti gli eventi per un gruppo particolare. Immagino che questo è un has_many: attraverso l'associazione, ma come faccio a specificare un has_many sul gruppo che trova tutti gli eventi nei progetti o personal_blogs di un gruppo? Potrei, naturalmente, specificare due associazioni e concatenare i risultati, ma poi devo riordinare, limite, condizioni, ecc in Ruby, che potenzialmente potrebbe essere un incubo prestazioni con molti eventi. Mi piacerebbe fare questo all'interno di ActiveRecord per evitare un tale incubo.
Nessuna soluzione corretta
Altri suggerimenti
Si potrebbe definire un metodo nella classe Gruppo come successivo:
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 non ti piace di SQL come la precedente, è sempre possibile utilizzare Single Table Inheritance. Questa soluzione dipende dalla vostra attributi e il comportamento , ma vi permetterà di utilizzare un "has_many attraverso" associazione.
Perché non basta fare:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def all_events
projects.events + personal_blogs.events
end
end