在进行数据库调用之前,我应该检查更新的属性吗?

问题描述:

在进行更新操作时,是否需要查看在更新记录之前是否有任何记录的属性发生了更改?仍然必须致电查询记录。在进行数据库调用之前,我应该检查更新的属性吗?

我打算不首先打电话给api,除非用户更新属性,但不知道在操作本身中放置警卫是否合适。这是使用Rails和PostgreSQL

Rails/Activerecord将负责确保它在真正需要时更新,并且属性有changed?。这里是一个例子,通过控制台

记录没有改变时的情况。当记录被改变更新查询不言

[9] pry(main)> user = User.last 
    User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]] 
    => #<User:0x007fee16801108 ...> 
    [10] pry(main)> user.save 
    (0.1ms) begin transaction #<====== NO UPDATE QUERY IS MADE 
    (0.0ms) commit transaction 
=> true 
[11] pry(main)> 

案例。更新查询

[12] pry(main)> user = User.last 
    User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? [["LIMIT", 1]] 
=> #<User:0x007fee12c02558 id: 1,...? 
[13] pry(main)> user.name = 'f' 
=> "f" 
[14] pry(main)> user.save 
    (0.1ms) begin transaction #<====== UPDATE QUERY IS MADE 
    SQL (0.3ms) UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = ? [["name", "f"], ["updated_at", "2017-10-19 06:56:51.385277"], ["id", 1]] 
"complete" 
    (2.2ms) commit transaction 
=> true 
[15] pry(main)> 

它取决于如何完成更新。

如果模型不是dirty,ActiveRecord将不会在DB上进行实际更新。

您可以比较更新前后的update_at值,只有在更改后才触发API。

这取决于您的需要。

首先如果它只是一列,作为我来说,我只是想检查我用workflow gem.的model..so单attribute..state ..和我加入模型回调只有当该属性改变这样的...

##workflow_state is my column name 
after_save :update_other_associations_status , if: :workflow_state_changed? 

此外,您还可以使用column_was如.. workflow_state_was其保存在db.I前检查旧值会建议看看ActiveModel::Dirty模块

其次,如果你想查询的模型的多个值,你可以用真棒papertrail,负责监测整个模型和它的高度可配置何时何地您需要捕捉的变动情况去模型的版本。

希望这会有所帮助