【发布时间】: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,也没有一个会更新 column1 或 column2。
列没有默认值。来自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