Можно ли иметь несколько Activerecord `принадлежать_TO`, указывающий на один и тот же класс?

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

Вопрос

Связывая спортивное мероприятие с двумя командами, сначала это, казалось, имело смысл:

events
  - id:integer
  - integer:home_team_id
  - integer:away_team_id

teams
  - integer:id
  - string:name

Однако меня беспокоит, как я бы связал это в модели активной записи:

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

Это лучшее решение?

В ответ на Подобный вопрос Я был указан на наследство на одной таблице, а затем обнаружил полиморфные ассоциации. Ни один из которых, казалось, не соответствовал этой ассоциации. Возможно, я смотрю на это неправильно, но я не вижу необходимости подключать команду в команду дома и в гостях, так как различие находится только в том, где игра играет. Если бы я пошел с наследством на одном таблице, я бы не хотел, чтобы каждая команда имела место, чтобы это было работать?

# 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

Это казалось слишком большой работой для того, чего я хотел достичь.

Я также думал о has_many через ассоциацию, но это, кажется, два, так как мне понадобятся только две команды, но эти две команды не принадлежат ни одному одному событию.

event_teams
  - integer:event_id
  - integer:team_id
  - boolean:is_home

Есть ли более чистый более семантический способ для создания этих ассоциаций в активной записи? Или одно из этих решений является лучшим выбором?

Спасибо

Это было полезно?

Решение

Ваше решение в порядке, так как одно и то же событие принадлежит двум командам. Полиморфные ассоциации применимы, когда несколько моделей могут быть предприняты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top