Ist es in Ordnung, mehrere activerecord `zu haben, die auf dieselbe Klasse hinweisen?
-
22-09-2019 - |
Frage
Bei der Verknüpfung eines Sportereignisses mit zwei Teams schien dies zunächst sinnvoll zu sein:
events
- id:integer
- integer:home_team_id
- integer:away_team_id
teams
- integer:id
- string:name
Ich bin jedoch beunruhigt darüber, wie ich das im aktiven Datensatzmodell verknüpfen würde:
class Event
belongs_to :home_team, :class_name => 'Team', :foreign_key => "home_team_id"
belongs_to :away_team, :class_name => 'Team', :foreign_key => "away_team_id"
end
Ist das die beste Lösung?
In einer Antwort auf a Ähnliche Frage Ich wurde auf eine einzelne Tabelle vererbt und fand später später polymorphe Assoziationen. Keiner von beiden schien zu dieser Vereinigung zu passen. Vielleicht schaue ich mir das falsch an, aber ich sehe keine Notwendigkeit, ein Team in Heim- und Auswärtsmannschaften zu unterteilen, da die Auszeichnung nur in dem Spiel ist, wo das Spiel gespielt wird. Wenn ich mit einer einzelnen Tischvererbung gehen würde, möchte ich nicht, dass jedes Team zu einem Ereignis gehört, also würde dies funktionieren?
# app/models/event.rb
class Event < ActiveRecord::Base
belongs_to :home_team
belongs_to :away_team
end
# app/models/team.rb
class Team < ActiveRecord::Base
has_many :teams
end
# app/models/home_team.rb
class HomeTeam < Team
end
# app/models/away_team.rb
class AwayTeam < Team
end
Das schien einfach zu viel Arbeit für das, was ich erreichen wollte.
Ich dachte auch über einen Has_Many durch Association nach, aber das scheint zwei zu sein, da ich immer nur zwei Teams brauchen werde, aber diese beiden Teams gehören zu keinem Ereignis.
event_teams
- integer:event_id
- integer:team_id
- boolean:is_home
Gibt es einen saubereren semantischeren Weg, um diese Assoziationen in aktiver Aufzeichnung zu machen? Oder ist eine dieser Lösungen die beste Wahl?
Vielen Dank
Lösung
Ihre Lösung ist in Ordnung, da das gleiche Ereignis zwei Teams gehört. Die polymorphen Assoziationen sind anwendbar, wenn mehrere Modelle ereignisfähig sind.