如果我在Users控制器中创建用户的实例变量,然后尝试添加到字段数组,我可以看到它已添加,但是当我去保存时,它不会保存
@instructor = User.find(current_user.id)
@instructor.clients = @instructor.clients << User.last.id
@instructor.save
然后,当我去Pry并使用我在Pry中创建的实例变量执行相同的操作时,它会保存。为什么这样,我怎样才能让它在控制器中工作?
数组字段是一个postgres数字数组。
你的问题是:
@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
实际上会将新数组写入数据库,并且下次将该指导者从数据库中拉出时,更新的数组将存在。