调用model.save有什么作用!在after_create回调中的save_change_to_attribute中?在after_save回调中?

时间:2019-05-06 09:39:37

标签: ruby-on-rails rails-activerecord

我已经设置了一个after_save回调来检查属性是否已更改以创建某些事件。但是存在一个使用model.save!的after_create回调。 generate_event被调用了多少次,save_change_to_attribute的结果是什么?在generate_event回调中?

after_create :set_references
after_save :generate_event

def set_references
    self.md_mms = self.id_token
    self.md_mms_id = self.id_token
    self.save!
 end

def generate_event
    if self.saved_change_to_status?
      event = Event.create!(resource: self, company: self.company, resource_id_token: self.id_token, resource_status: self.status)
      EventResourceStateUpdateJob.perform_later(event)
    end
  end

我正在期待save_change_to_status吗?返回true,但返回false。

1 个答案:

答案 0 :(得分:0)

您的回调没有意义,您不应该在after_save中调用工人,它不能保证记录得以持久。应该是after_commit,而set_references应该是before_save,因为您正在设置属性,还需要saved_change_to_status?作为回调的参数。并且无需在您的回调中调用save。

before_save :set_references
after_commit :generate_event, if: :saved_change_to_status?

def set_references
  self.md_mms = self.id_token
  self.md_mms_id = self.id_token
 end

def generate_event
  Event.create(resource: self, company: self.company, resource_id_token: self.id_token, resource_status: self.status)
  EventResourceStateUpdateJob.perform_later(event)
 end