【问题标题】:Unable to change values in ActiveRecord无法更改 ActiveRecord 中的值
【发布时间】:2015-12-08 22:47:05
【问题描述】:

当我在 Rails 数据库中加载一些值并更改它们的值时,

x = MyModel.find(123) 
# => #<MyModel id: 123, column1: 0, column2: true, ...>
x.column1 = nil # => nil
x.column2 = nil # => nil
x.save! # => true
# byebug output from my after_save callback which can modify these values
[117, 120] in /home/sam/mina-NQA/releases/23/app/models/publisher.rb
   117:
   118:   def set_recommendation
   119:     byebug
=> 120:     return nil if self.column1
x = MyModel.find(123) 
# => #<MyModel id: 123, column1: nil, column2: nil, ...>

重新加载相同的值或查看 MyModel#show 页面都会还原这些值!

x = MyModel.find(123) 
# => #<MyModel id: 123, column1: 0, column2: true, ...> # !!!

为什么我的更改不会持续存在?编辑: byebug 显示我的更改从未应用过,这与持久性无关。为什么我的更改不适用?


我确实有一个 after_save 回调 after_save :set_column1。但我确信它不会导致我的问题,因为它包含像 return nil unless self.column2 这样的行。我确实有一个before_save :create_sub_model,它只创建嵌套模型。我确实有过滤器,但没有一个会影响 MyModel#show,也没有一个会更新 column1column2

列没有默认值。来自db/schema.rb

t.integer  "column1",  limit: 4
t.boolean  "column2",  limit: 1

我也尝试过在不保存的情况下更新列:

x = MyModel.find(123) 
# => #<MyModel id: 123, column1: 0, column2: true, ...>
x.update_column(:column1, nil) # => true
x.update_column(:column2, nil) # => true
x = MyModel.find(123) 
# => #<MyModel id: 123, column1: nil, column2: nil, ...>
x = MyModel.find(123) 
# => #<MyModel id: 123, column1: 0, column2: true, ...> #!!!

Rails/ActiveRecord 中是否有一个函数可以询问:“加载此文件时会发生什么?” (我的production.log里没有这个信息。)


ruby -v # => ruby 2.0.0p353 (2013-11-22 revision 43784) [i686-linux]
rails -v # => Rails 4.2.1
mysql # => Server version: 5.1.73 Source distribution

【问题讨论】:

  • 嘿,你检查过 column2 的默认值吗?可能是true 所以。
  • @VishalJAIN 一个有效的问题,但不是。我现在会更新问题以反映。
  • 使用 byebug gem 并使用来查看所有回溯,请把它放在这里
  • @Sam 还会检查名称为 column2 的模型中是否有任何方法被覆盖,因为代码看起来不错。
  • 如果您在x.save! 之后检查x,它是否具有nil 值?如果没有,您的after_save 很可能是罪魁祸首。

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord


【解决方案1】:

当您对 ActiveRecord 对象调用 save 时,除了保存回调(before_save、after_save)之外,还会触发更新回调。如果有的话,请查看更新(之前和之后)回调。

【讨论】:

  • 抱歉,好像不是这样。请参阅 cmets。
猜你喜欢
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2011-10-16
相关资源
最近更新 更多