如果给定字段是唯一的更新属性,则跳过after_update-Ruby on Rails

时间:2018-07-24 20:49:22

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

我有一个可以在同一更新请求中更新两次的模型。

这是我的过滤器:

after_update :make_api_call

在我的函数中,我更新了api,然后将响应保存在同一对象上。

def make_api_call
    response = SomeAPI.call    
    self.api_response = response
    self.save
end

显然,这将导致无限循环调用更新功能。如果要更新的唯一属性是make_api_call属性,我希望跳过api_response函数。在更新之前执行API调用不是对与记录关联的某些嵌套资源的选择。

2 个答案:

答案 0 :(得分:1)

从Rails 5.1开始,您还可以:

after_update :make_api_call, unless: :saved_change_to_response?

saved_change_to_response?方法来自ActiveRecord::AttributeMethods::Dirty,该方法允许我们通过在属性名称前加上saved_change_to_来检查特定属性是否已更改。

答案 1 :(得分:0)

您可以使用ActiveRecord::Persistence#update_columns跳过回调。

def make_api_call
  response = SomeAPI.call    
  update_columns(api_response: response)
end