在rails 3.0.9/ruby 1.9.2当我尝试更新模型外键时,出现意外的行为。Rails3 activerecord update_attributes无法保存foreign_key
我开始一个新的安装在app /型号
$ rails new mytest
$ rails g model User
$ rails g model Ad user_id:integer
$ rake db_migrate
添加关联/ Ad.rb
Class User < ActiveRecord::Base
belongs_to :user
end
现在到了有趣的部分。我想直接更改对象上的外键。我进入轨道控制台轨道ç
$ u = User.create
$ a=Ad.create(:user=>u)
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 4
所以这是行不通的。我尝试直接设置对象而不是传递它来创建:
$ u = User.create
$ a=Ad.create
$ a.user = u
$ a.save
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 5
不起作用。
的作品的唯一事情是这样的:
$ u = User.create
$ a=Ad.create
$ a.user_id = u.id
$ a.save
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 9999
能有人请解释是怎么回事,我怎么可以改变我的对象的外键?我假设当对象关联被实例化并且存在冲突时发生“阻塞”行为,所以一个答案是这样做的:
$ Ad.find(a.id).update_attributes(:user_id => xxxx)
这是有效的。但是,在一个对象上更改外键看起来还有很长的路要走。它还需要额外的数据库命中,最后如果对象内部需要自行更新,则代码非常混乱。该怎么办?
顺便说一下之前就卸载加载的对象:我就遇到了这个问题的原因是,我从机械师切换到FactoryGirl。机械师不会在创建时加载关联的对象,但FactoryGirl会这样做。 – user681814