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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top