Rails Ассоциации - Несколько связей has_one к одному и тому же классу - PullRequest
4 голосов
/ 27 января 2012

Пример моего выпуска - спортивная игра.Спортивная игра состоит из двух команд, домашней команды и команды гостей.Вот мои активные модели записей:

class Team < ActiveRecord::Base

  belongs_to :game

end

class Game < ActiveRecord::Base

  has_one :home_team, :class_name => "Team"
  has_one :away_team, :class_name => "Team"

end

Я хочу получить доступ к команде через игру, например: Game.find (1) .home_team

Но яполучение унифицированной постоянной ошибки: Game :: team.Может кто-нибудь сказать мне, что я делаю не так?Спасибо,

Ответы [ 4 ]

7 голосов
/ 24 января 2013

Если Game has_one :team, тогда Rails предполагает, что в таблице ваших команд есть столбец game_id. Однако вы хотите, чтобы в игровой таблице был столбец team_id, в этом случае вы должны использовать Game belongs_to :team. Как английский, в данном случае это звучит задом наперед, но как Ruby, это правильно.

Я немного упростил. Вы бы хотели что-то вроде:

class Team < ActiveRecord::Base
  has_many :home_games, :class_name => "Game", :foreign_key => 'home_team_id'
  has_many :away_games, :class_name => "Game", :foreign_key => 'away_team_id'
end

class Game < ActiveRecord::Base
  belongs_to :home_team, :class_name => "Team"
  belongs_to :away_team, :class_name => "Team"
end
1 голос
/ 27 января 2012

Я только что проверил ваш код, и он должен работать.

Я подозреваю, что ваше имя файла неверно.Убедитесь, что ваши имена файлов в приложении / models /:

  • game.rb
  • team.rb

, а не:

  • games.rb

    или

  • teams.rb
1 голос
/ 27 января 2012

Я думаю, что это может быть ошибкой вашей архитектуры.

Игра не может отличить две команды с этой архитектурой.

Так что, пожалуйста, запустите так

rails g migration add_stadium_to_game stadium:integer
rails g migration add_home_to_team home:integer
rake db:migrate

и отредактируйте "game.rb" следующим образом

class Game < ActiveRecord::Base

  has_many :teams

  def home_team
    teams.select { |team| team.home == self.stadium }.first
  end

  def away_team
    teams.select { |team| team.home != self.stadium }.first
  end

end

Конечно, это один из примеров, поэтому есть много способов реализовать вашу цель.

0 голосов
/ 27 января 2012

Звучит как проблема с пространством имен.Попробуйте явно объявить класс (с пространством имен) для команды.Например:

has_one :home_team, :class_name => "::Team"

http://guides.rubyonrails.org/association_basics.html#the-has_one-association

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...