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

时间:2017-10-19 04:47:06

标签: ruby-on-rails activerecord ruby-on-rails-5

在进行更新操作时,如果在进行数据库调用以更新记录之前是否有任何记录属性已更改,是否值得一看?仍然需要进行调用才能查找记录。

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

3 个答案:

答案 0 :(得分:1)

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)>

答案 1 :(得分:0)

这取决于更新的准确程度。

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

您可以比较更新前后的update_at值,并仅在更改时触发API。

答案 2 :(得分:0)

这取决于你的需要。

首先 如果它只有一列 ,在我的情况下,我只是想检查一个属性...的状态model..so我使用了workflow gem. ..我只在该属性改变时添加了模型回调......

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

此外,您还可以使用column_was例如.. workflow_state_was检查旧值,然后将其保存在db中。我建议您查看ActiveModel::Dirty模块

其次 如果您想检查模型的多个值 ,您可以选择真棒papertrail,监控整个模型及其高度可配置性,以及何时何地需要捕获模型版本中的更改。

希望这有帮助