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