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

问题描述 投票:0回答:1

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

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

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

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

ruby-on-rails ruby arrays rails-activerecord pry
1个回答
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实际上会将新数组写入数据库,并且下次将该指导者从数据库中拉出时,更新的数组将存在。

© www.soinside.com 2019 - 2024. All rights reserved.