为什么这在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
答案 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的广告实例,但由于之前的更改从未持久保存到数据库,因此user
为nil
。
与第一个代码段中显示的一样,您必须使用本地变量临时保留对Ad实例的引用,以便在其上调用.save
,以便持久保存到数据库。这应该有效:
foo = Ad.find(2)
foo.user = User.find(1)
foo.save
Ad.find(2).user # => #<User id: 1>