Ruby on rails ActiveRecord关系不起作用?

时间:2015-08-04 23:44:46

标签: ruby-on-rails ruby activerecord

我有一个问题,我的ActiveRecord :: Relation不工作我有3个Db的用户,游戏,成就他们之间定义的关系是这样的

用户

has_many :games

游戏

belongs_to :user
has_many :achievements

成就

belongs_to :game

问题在于我试图打电话

Game.where(:appid => game["appid"]).achievements.new

它让我和错误说

undefined method `achievements' for #<Game::ActiveRecord_Relation:0x730f9f8>

我在Ruby on Rails 4.1.8上运行,我不知道为什么会发生这种情况(我的Achievements表中有belongs_to:game,index:true列,我不能想到为什么它不是工作)

3 个答案:

答案 0 :(得分:1)

您在这里获得了一个关联:

 Game.where(:appid => game["appid"])

...这是作为一个对象数组实现的(即使sql没有返回任何记录,那么它仍然是一个数组,虽然它是空的)。

您需要选择其中一个......可能是第一个,如下所示:

 Game.where(:appid => game["appid"]).first.achievements.new

或者您可以浏览值:

 Game.where(:appid => game["appid"]).each { |game| game.achievements.new }

或其他一些。

答案 1 :(得分:0)

可能你应该选择一个型号

Game.where(:appid => game["appid"]).first

然后获得关系模型

.achievements.new

答案 2 :(得分:0)

答案是例外。 #where返回ActiveRecord_Relation,而不是游戏,即使关系中只有一个游戏。所以你真的有一个可枚举的。即:

chrome.webNavigation.onBeforeNavigate.addListener()

chrome.webRequest.onBeforeRedirect.addListener()

如果您只想要符合条件的第一款游戏,可以使用find_by

puts Game.where(:appid => game["appid"]).first.achievements.new

但我不确定这是你在找什么