has_many: через ассоциацию через две разные ассоциации

StackOverflow https://stackoverflow.com/questions/2344220

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня четыре модельных класса:

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

Я хочу найти все события для конкретной группы. Я полагаю, что это has_many: через ассоциацию, но как мне указать has_many в группе, которая находит все события в проектах или же Personal_blogs of Group? Я мог бы, конечно, указать две ассоциации и объединить результаты, но тогда мне приходится повторно сортировать, ограничить, состояние и т. Д. В Ruby, что потенциально может стать кошмаром производительности со многими событиями. Я хотел бы сделать это в Activerecord, чтобы избежать такого кошмара.

Нет правильного решения

Другие советы

Вы можете определить метод в групповом классе, как следующий:

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

Если вам не нравится SQL, как предыдущий, всегда можно использовать наследство с одной таблицей. Это решение зависит от вашего классы атрибуты и поведение, но позволит вам использовать ассоциацию «has_many через».

Почему бы просто не сделать:

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

  def all_events
    projects.events + personal_blogs.events
  end
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top