2015-04-02 2 views
1

Я пытаюсь сохранить модель пользователя «синхронно» с третьей стороной.Как пропустить 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

+0

Их никогда не следует называть частью одного и того же сохранения. Если это новая запись (без идентификатора), она будет вызывать 'before_create', а если нет, она будет вызывать' before_update'. Вы уверены, что он вызывает оба обратных вызова при сохранении? –

+0

@MaxWilliams У меня были контрольные точки byebug в обоих обратных вызовах, так что да, похоже. – wpp

+1

Если это действительно так (и я все еще не убежден), это означает, что ваша версия Rails ведет себя по-другому в обычном режиме. Если это так, то это может быть только верхушкой айсберга. Я попытался бы выяснить, почему ** before_create и before_update вызываются при одном и том же сохранении, а не просто пытаются обойти его, или вы можете столкнуться с множеством других странных проблем дальше по линии. –

ответ

1

Поскольку вы хотите сохранить третью сторону синхронизирован по каждому сохранить, но просто хочу, чтобы изменить действие, основанное о том, создается или обновляется запись.

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

Ничего, я дам это попытка и отметьте как принято, если это сработает. Спасибо. – wpp

Смежные вопросы