在一个模型中,我有这个:
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_id
为nil
且没有关联的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
端
答案 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语句,它将引发异常。