【问题标题】:Rails save method if no changes如果没有更改,Rails 保存方法
【发布时间】:2014-06-25 15:20:42
【问题描述】:

我似乎记得在某处读到过,如果没有更改任何属性(可能是活动记录脏的一部分),rails 不会提交到数据库,是这样吗?我似乎找不到它,而且快速浏览了源代码后我也没有更明智的选择。

如果这是错误的,我需要使用 before_save 回调,因为我想根据是否发生更改来运行一些代码。

我假设使用脏数据的 after_save 不起作用??

【问题讨论】:

    标签: ruby-on-rails dirty-data


    【解决方案1】:

    Rails 不会执行 UPDATE,但它会运行 after_save 回调,即使没有任何变化:

    pry $ u = User.first
    => #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
    pry $ u.updated_at
    => Tue, 24 Jun 2014 18:36:04 UTC +00:00
    pry $ u.changed?
    => false
    pry $ u.save
    From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :
    
        1: class User < ActiveRecord::Base
        2:
     => 3:   after_save -> { binding.pry }
    
    pry $ exit
    => true
    pry $ u.updated_at
    => Tue, 24 Jun 2014 18:36:04 UTC +00:00
    

    如果您想根据 before_save 中特定属性的更改来做一些事情,只需执行以下操作:

    pry $ u = User.first
    => #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
    pry $ u.save
    => true
    pry $ u.name = "John Doe"
    => "John Doe"
    pry $ u.save
    From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :
    
        1: class User < ActiveRecord::Base
        2:
     => 3:   before_save -> { binding.pry if name_changed? }
    

    这里有脏文档:http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

    【讨论】:

    • 谢谢,我查看了 Dirty 文档,但其他地方的人说 after_save 回调仍然有可用的脏数据属性哈希。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多