ActiveRecord #increment!返回false,但没有错误

时间:2012-07-21 20:56:22

标签: ruby-on-rails activerecord increment

这是我控制器中的一段代码:

  @post.increment!(:views_count) # => false, record not saved, views_count is 0
  @post.errors                   # => is empty
  @post.save!                    # => true, views_count magically incremented to 1

问题是,没有#save!它没有真正起作用:记录未更新,views_count为0.任何想法?

3 个答案:

答案 0 :(得分:0)

您是否尝试重新加载记录?我打赌你正在查看该文件的缓存版本。尝试:

@post.increment!(:views_count)
@post.reload

答案 1 :(得分:0)

我认为您使用该方法的方式没有任何问题。

当无法保存记录时,increment!返回false。

我认为你可以尝试的一件事是将views_count属性初始化为0.我认为它当前可能是nil而不是整数值。在nil值上,您无法执行+=运算符。

要初始化属性的值,请在db / migrate文件夹下找到该属性的迁移文件。

将属性代码修改为类似的内容。

t.integer :views_count, default: 0

或者如果您在创建表格时单独添加了列...

add_column :appropriate_model, :views_count, :integer, default: 0

答案 2 :(得分:0)

请注意,increment!会调用update_attribute,而save(:validate => false)会调用before_*。这会跳过验证,但the callback chain is still executed和:

  

如果任何before_ *回调返回false,则取消操作并且save返回false。

您的模型中是否定义了任何可能返回false但未在errors中设置任何内容的{{1}}回调?