【问题标题】:ActiveRecord #increment! returns false, but no errors活动记录#增量!返回 false,但没有错误
【发布时间】:2012-07-22 06:16:02
【问题描述】:

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

  @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。有什么想法吗?

【问题讨论】:

  • 您能否发布其余的控制器代码,至少是正在执行的操作,可能还有模型?

标签: ruby-on-rails activerecord increment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    把属性代码修改成这样。

    t.integer :views_count, default: 0
    

    或者如果您在创建表之外单独添加列...

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

    【讨论】:

    • increment method的来源表示如果是nil则将属性值初始化为0:self[attribute] ||= 0
    【解决方案3】:

    注意increment! 调用update_attribute,而后者又调用save(:validate => false)。这会跳过验证,但 the callback chain is still executed,并且:

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

    您的模型中是否定义了任何 before_* 回调,这些回调可能返回 false 但未在 errors 中设置任何内容?

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2014-03-12
      • 2011-07-26
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多