Rails bug?使用数组更新实例变量并不总是有效

时间:2013-08-27 00:49:17

标签: ruby-on-rails ruby arrays rails-activerecord pry

如果我在Users控制器中创建用户的实例变量,然后尝试添加到字段数组,我可以看到它已被添加,但是当我去保存时,它不会保存

@instructor = User.find(current_user.id)
@instructor.clients = @instructor.clients << User.last.id
@instructor.save

当我转到Pry并使用我在Pry中创建的实例变量执行相同的操作时,它会保存。为什么这样,我怎样才能让它在控制器中工作?

数组字段是一个postgres数值数组。

1 个答案:

答案 0 :(得分:2)

你的问题是:

@instructor.clients = @instructor.clients << User.last.id

实际上并没有以ActiveRecord知道的方式更改@instructor.clients

例如:

>> a = [ ]
>> b = a << 6
>> b.object_id
=> 2165471260
>> a.object_id
=> 2165471260

相同object_id表示相同的数组,但没有人(但您)知道a实际已更改。

所以@instructor.clients是你向它添加User.last.id之前的同一个对象,就像你将User.last.id推到它上面之后的那样,而且ActiveRecord不会意识到你已经改变了任何东西。然后你@instructor.save并且它成功地什么也没做。

您需要创建一个新阵列:

@instructor.clients = @instructor.clients + [ User.last.id ]

Array#+创建了一个全新的数组,这将让ActiveRecord知道某些内容已发生变化。然后你的@instructor.save实际上会将新数组写入数据库,下次将该指导员拉​​出数据库时,更新后的数组就会存在。