首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails关联-同一类的多个has_one关系

Rails关联-同一类的多个has_one关系
EN

Stack Overflow用户
提问于 2012-01-28 01:17:19
回答 4查看 2.6K关注 0票数 5

我的问题的一个例子是一个体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的活动记录模型如下:

代码语言:javascript
复制
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。有人能告诉我我哪里做错了吗?谢谢,

EN

回答 4

Stack Overflow用户

发布于 2013-01-25 03:30:34

如果为Game has_one :team,则Rails假定您的teams表有一个game_id列。不过,您需要的是让游戏表有一个team_id列,在这种情况下,您将使用Game belongs_to :team。作为英语,它在这种情况下听起来有点落后,但作为Ruby,它是正确的。

我确实做了一点简化。你可能需要这样的东西:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2012-01-28 01:35:09

我刚刚测试了你的代码,它应该可以工作。

我怀疑的是你的文件名有误。确保应用程序/模型/中的文件名为:

  • game.rb
  • team.rb

而不是:

  • games.rb

  • teams.rb
票数 2
EN

Stack Overflow用户

发布于 2012-01-28 02:35:39

我认为这可能是你的架构的一个错误。

在这种架构下,游戏不能区分两个团队。

所以,请像这样跑

代码语言:javascript
复制
rails g migration add_stadium_to_game stadium:integer
rails g migration add_home_to_team home:integer
rake db:migrate

然后,像这样编辑"game.rb“

代码语言:javascript
复制
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

当然,这只是一个例子,所以有很多方法可以实现你的目的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9037340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档