has_many: через ассоциацию через две разные ассоциации
-
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