Has_Many: Durch Assoziation durch zwei verschiedene Assoziationen
-
23-09-2019 - |
Frage
Ich habe vier Modellklassen:
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
Ich möchte alle Ereignisse für eine bestimmte Gruppe finden. Ich denke, dies ist ein HASMANY: Durch Assoziation, aber wie kann ich einen HASMANY in der Gruppe festlegen, das alle Ereignisse in den Projekten findet oder Personal_blogs einer Gruppe? Ich könnte natürlich zwei Assoziationen angeben und die Ergebnisse verkettet, aber dann muss ich in Ruby neu sortieren, limitieren, Zustanden usw. Ich würde dies gerne in Activerecord tun, um einen solchen Albtraum zu vermeiden.
Keine korrekte Lösung
Andere Tipps
Sie können eine Methode in der Gruppenklasse wie als nächstes definieren:
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
Wenn Sie SQL wie das vorherige nicht mögen, ist es immer möglich, eine einzelne Tabellenvererbung zu verwenden. Diese Lösung hängt von Ihrem ab Klassenattribute und Verhalten, aber ermöglicht es Ihnen, einen "Has_Many durch" Association zu verwenden.
Warum nicht einfach:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def all_events
projects.events + personal_blogs.events
end
end