Я пытаюсь сохранить модель пользователя «синхронно» с третьей стороной.Как пропустить before_update, если before_create был вызван
Так что в моем 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)
}
Но я не очень уверен/комфортно с этим решением. Есть ли лучший способ приблизиться к этому?
EDIT
Я извиняюсь, конечно, это была моя ошибка, благодаря @Max Williams я хотел, чтобы добраться до нижней части этого, так что для любознательных:
I также был:
after_create { A.new() }
Что-то в его недрах сделал это:
user.toggle(:active)
теперь делает это:
user.update_attributes(active: true).
и не понял, что toggle
скачет validations and callbacks
Их никогда не следует называть частью одного и того же сохранения. Если это новая запись (без идентификатора), она будет вызывать 'before_create', а если нет, она будет вызывать' before_update'. Вы уверены, что он вызывает оба обратных вызова при сохранении? –
@MaxWilliams У меня были контрольные точки byebug в обоих обратных вызовах, так что да, похоже. – wpp
Если это действительно так (и я все еще не убежден), это означает, что ваша версия Rails ведет себя по-другому в обычном режиме. Если это так, то это может быть только верхушкой айсберга. Я попытался бы выяснить, почему ** before_create и before_update вызываются при одном и том же сохранении, а не просто пытаются обойти его, или вы можете столкнуться с множеством других странных проблем дальше по линии. –