Несколько отношений has_many к одному и тому же классу - PullRequest
1 голос
/ 05 сентября 2011

Я строю футбольную игру, и у меня возникают проблемы при создании классов Club и Match.Я хочу быть в состоянии сделать это:

match = Match.find(2)
match.home_club = <some club here>
match.away_club = <other club here>

А также это:

club = Club.find(2)
club.matches # Returns all matches where club plays home or away

Это то, что у меня сейчас:

class Club < ActiveRecord::Base
  has_many :matches
end

class Match < ActiveRecord::Base
  belongs_to :home_club, :class_name => "Club"
  belongs_to :away_club, :class_name => "Club"
end

Но когда япопробуйте сделать Club.first.matches, я получаю эту ошибку:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: matches.club_id: SELECT "matches".* FROM "matches" WHERE ("matches".club_id = 1)

Я играл с :inverse_of, но у меня не получилось.Это вообще возможно, или мне нужно иметь два отдельных :has_many отношения в Клубе?Вот так:

class Club < ActiveRecord::Base
  has_many :home_matches, :class_name => "Match"
  has_many :away_matches, :class_name => "Match"
end

Я тоже пробовал, но и это не сработало.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Вы определили отношение в своей схеме как home_club_id и away_club_id? Поскольку кажется, что rails пытается получить match.club_id, что явно противоречит модели, которую вам требуется

Я думаю, что ваша модель неверна и должна быть пересмотрена. У клубов не должно быть match_id.

Совпадение должно быть:

  • home_club_id
  • away_club_id
  • время
  • оценка

Клуб должен быть:

  • имя
  • город

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

Если вы хотите иметь возможность сделать club.matches. Возможно, вам придется написать собственный SQL-запрос, который будет выглядеть в столбцах home_club и away_club. Или составьте таблицу отношений для клубов -> матч, в котором есть дополнительное метафольд, в котором говорится, был ли клуб дома или в гостях. Пока у вас есть домашние и выездные клубы в таблице матчей

0 голосов
/ 05 сентября 2011

Вы строите отношения «многие ко многим», поэтому вам понадобится таблица ссылок.Вместо того, чтобы иметь внешние ключи в любой из ваших таблиц сущностей, эта таблица хранит эти отношения и не должна иметь ничего, кроме match_id и club_id, чтобы связать две таблицы.Затем вы можете использовать

class Club < ActiveRecord::Base
    has_many :matches, :through => :matches_clubs
end

и т. Д.

Подробнее здесь http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

...