0

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

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

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

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

4

1 回答 1

2

你的问题是这样的:

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

实际上并没有@instructor.clients以 ActiveRecord 知道的方式发生变化。

例如:

>> 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实际上会将新数组写入数据库,并且下次您将该讲师从数据库中拉出时,更新的数组将在那里。

于 2013-08-27T01:31:12.503 回答