【问题标题】:Rails bug? updating instance variable with array not always working导轨错误?用数组更新实例变量并不总是有效
【发布时间】:2013-08-27 00:49:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 定义“不保存”。你有错误吗? save 是否返回 false?记录只是没有出现在数据库中吗?你确定你完全只运行这三行吗?
  • 不是您问题的答案,但您可以使用@instructor.clients &lt;&lt; User.last_id。分配 (@instructor.clients = @instructor.clients &lt;&lt; User.last_id) 是多余的。
  • 没有错误,它返回true。事实上,当我在窥探时,我尝试从控制器中保存实例变量,它保存为尝试,但实际上并没有保存记录。我在 pry 中对实例变量进行相同的操作,它保存 true 并保存记录
  • 你试过括号吗,比如 (@instructor.clients
  • 是的,我在控制器中尝试了括号,无济于事

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


【解决方案1】:

你的问题是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多