如果调用before_create,如何跳过before_update

时间:2015-04-02 11:04:16

标签: ruby-on-rails ruby callback

我正在努力让用户模型与第三方保持“同步”。

所以在我的User.rb中:

before_create { ThirdParty.create!(user: self) }
before_update { ThirdParty.update!(user: self) }

问题出现在我:

User.create!...

因为两个回调都会被调用(before_create然后before_update)。

这就是我现在解决这个问题的方法:

before_create {
 @before_create_called = true
 ThirdParty.create!(user: self)
}
before_update {
 return unless @before_create_called
 ThirdParty.update!(user: self)
}

但我对这个解决方案不太自信/不满意。有没有更好的方法来解决这个问题?

修改

我很抱歉,当然这是我的错,感谢@Max Williams我想要深究这一点,所以对于好奇:

我也有:

after_create { A.new() }

其中的某个方面做了这个:

user.toggle(:active)

现在它这样做:

user.update_attributes(active: true).

并没有意识到toggle跳过validations and callbacks

1 个答案:

答案 0 :(得分:1)

由于您希望在每次保存时保持第三方同步,但只想根据是创建还是更新记录来更改操作,请尝试:

before_save do
  self.new_record? ? ThirdParty.create!(user: self) : ThirdParty.update!(user: self)
end