2012-08-14 47 views
0

在一个模型中,我有这样的:Rails - 模型关联似乎是保存,但find()期间没有加载?

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 

+1

如果你想要一个游戏有一个turn_id,游戏必须'belongs_to:turn',然后轮到'has_one:game' 但是我猜游戏应该有不止一个回合?不应该游戏'has_many:转身'和turn'belongs_to:游戏'? – 2012-08-14 17:25:32

+0

另外你如何设置一个游戏的turn_id?如果游戏没有得到转牌的参考,它将为零。你也需要在Turn模式has_many:我相信的游戏。 – TheDude 2012-08-14 18:11:43

+0

有一个代表当前转弯状态信息的转弯。 – 2012-08-14 18:16:33

回答

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

+0

这不起作用。 game.turn.create是未定义的,首先,game.build_turn产生同样的问题。 – 2012-08-14 18:24:06

0

东西被反转。

由于Turn有belongs_to语句,Turn应该包含game_id,而不是其他方式。

所以你不能访问游戏的turn_id,因为该字段不存在。它将永远是零,如果你删除has_one语句,它会引发异常。