为什么不链接模型查询/分配在rails控制台中有效?

时间:2013-06-05 07:26:23

标签: ruby-on-rails activerecord

为什么这在rails控制台中有效:

foo = Ad.find(2)
foo.user = User.find(1)
foo.user # => #<User id: 1, name: "john">

但这不是吗?

Ad.find(2).user = User.find(1)
Ad.find(2).user  # => nil

1 个答案:

答案 0 :(得分:2)

因为每次编写Ad.find(2)时,它都会返回ID为2的Ad类的新实例,并且您的代码正在更改该实例上的关联用户但从不保存更改。所以在这一行:

Ad.find(2).user = User.find(1)

您获取ID为2的广告实例,将该实例的user关联设置为User.find(1),但此更改从未保存到数据库,并且在语句结束后丢失。在下一行:

Ad.find(2).user  # => nil

您只是提取另一个ID为2的广告实例,但由于之前的更改从未持久保存到数据库,因此usernil

与第一个代码段中显示的一样,您必须使用本地变量临时保留对Ad实例的引用,以便在其上调用.save,以便持久保存到数据库。这应该有效:

foo = Ad.find(2)
foo.user = User.find(1)
foo.save
Ad.find(2).user  # => #<User id: 1>