在进行数据库调用之前,我应该检查更新的属性吗?
问题描述:
在进行更新操作时,是否需要查看在更新记录之前是否有任何记录的属性发生了更改?仍然必须致电查询记录。在进行数据库调用之前,我应该检查更新的属性吗?
我打算不首先打电话给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)>
答
这取决于您的需要。
首先,如果它只是一列,作为我来说,我只是想检查我用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,负责监测整个模型和它的高度可配置何时何地您需要捕捉的变动情况去模型的版本。
希望这会有所帮助