Rails - 模型关联似乎是保存,但在find()期间没有加载?

时间:2012-08-14 17:19:02

标签: ruby-on-rails ruby activerecord model

在一个模型中,我有这个:

class Game < ActiveRecord::Base
  has_one :turn

  attr_accessor :turn
  attr_accessible :turn

  default_scope :include => :turn

  def Game.new_game
    turn = Turn.create count: 1, phase: 'upkeep', player: 1
    game = Game.create turn: turn
    game
  end
end

class Turn < ActiveRecord::Base
  belongs_to :game
end

后来,在控制器中,我有这个:

respond_with Game.find(params[:id])

但由于某些原因,返回的游戏的turn_idnil且没有关联的turn对象。

为什么没有正确保存关联,或者没有使用find()正确返回?

在我的迁移中,我认为我已正确设置关联:

create_table :games do |t|
   t.timestamps
end

def change
 create_table :turns do |t|
   t.string :phase
   t.integer :count

   t.references :game
   t.timestamps
 end

2 个答案:

答案 0 :(得分:0)

你好像搞砸了关联

根据对情景的理解,这就是我的想法。

关联应该像

class Game < ActiveRecord::Base
  has_one :turn

  #.....
end

class Turn < ActiveRecord::Base
  belongs_to :game
  #.....
end

和像

这样的迁移
create_table :games do |t|
  #add some columns
  t.timestamps
end


create_table :turns do |t|
  t.references :game
  #add some columns
  t.timestamps
end

现在添加新游戏并转向

    game = Game.create 
    turn = game.turn.create  count: 1, phase: 'upkeep', player: 1

game.tun.create会自动使用game_id = game.id和其他提供的参数创建转弯记录。

你的移植问题是游戏是指转向,而不应该相反。

在此处查找有关协会的更多信息 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html http://guides.rubyonrails.org/association_basics.html

答案 1 :(得分:0)

有些东西倒了。

由于Turn有belongs_to语句,Turn应该包含game_id,而不是相反。

因此,您无法访问游戏turn_id,因为该字段不存在。它总是为零,如果你删除has_one语句,它将引发异常。