Rails 2.3.8: проверка объекта перед сохранением показывает предыдущие ссылки, а не обновленные - PullRequest
3 голосов
/ 21 июня 2011

На моем сайте есть форма, позволяющая обновить объект (например, книгу).Книга содержит поле author_id, которое ссылается на класс Author.Форма позволяет сменить автора.

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

def some_validation
    author = Author.find(self.author_id)
    ...
 end

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

Спасибо!

1 Ответ

2 голосов
/ 21 июня 2011

Это проблема, которую вы можете продублировать в консоли:

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?

(извините, если это было много болтовни, которая по сути не ответила на ваш вопрос; -)

...