В вашем примере, если вы вызвали champ.winner
для нового и неизмененного экземпляра Champ
, экземпляр Champ будет зафиксирован в БД и будет выглядеть в базе данных следующим образом:
winner: 'me'
awesome: true
should_watch: true
loser: nil
coach: nil
Обратный вызов after_create
будет вызываться, если это новая запись, а если нет, то обратный вызов after_update
будет (поэтому loser
будет нулевым, если экземпляр был новым). Однако, поскольку они просто вызывают метод установки в экземпляре, они будут только обновлять экземпляр и не будут вносить больше изменений в базу данных.
Вы можете использовать update_attribute
в методах наблюдателя или модели, чтобы зафиксировать изменение, но если вам действительно не нужно иметь запись в базе данных, а затем обновить ее, это расточительно. В этом примере, если вы хотите, чтобы эти обратные вызовы фактически устанавливали loser
и coach
в базе данных, было бы более эффективно использовать before_save
и before_create
.
На сайте гидов Rails есть хороший обзор обратных вызовов здесь , если вы еще не читали его.