Это проблема, которую вы можете продублировать в консоли:
b = Book.new
=> #<Book id:nil, etc...>
b.author_id = 1
=> 1
b.author
=> #<Author id:1, etc...>
b.author_id = 2
=> 2
b.author
=> #<Author id:1, etc...>
, поэтому ... изменение идентификатора ассоциации (что и делает форма update_attributes) не изменяет загруженный связанный объект.
но, если вы сначала аннулируете объект, связанный объект перезагрузится:
b.author = nil
=> nil
b.author_id = 2
=> 2
b.author
=> #<Author id:2, etc...>
Так что вы можете (обратите внимание на курсив, потому что я не знайте что является лучшим решением) установите для контроллера значение nil в контроллере, если идентификатор ассоциации указан в хэше params, или продолжайте использовать ваш метод, но добавьте защиту для перезагрузки только при необходимости
author = Author.find(self.author_id) if self.author_id_changed?
(извините, если это было много болтовни, которая по сути не ответила на ваш вопрос; -)