Я обнаружил странность в методе Activereecord #relationship_ids (который добавляется автоматически, когда вы объявляете 'has_many'), который сразу сохраняет для существующих записей, что вызывает у меня некоторые проблемы, и мне интересно, есть ли у кого-нибудь полезные советы .
Я использую Rails 2.3.5.
Рассмотрим этот простой сценарий, где в статье есть теги has_many, скажем:
a = Article.first
a.name = "New Name" # No save yet
a.author_id = 1 # No save yet
a.tag_ids = [1,2,3] # These changes are saved to the database
# immediately, even if I don't subsequently
# call 'a.save'
Это кажется мне удивительным. В частности, это вызывает проблемы при попытке создать средство предварительного просмотра - я хочу обновить набор атрибутов, а затем просмотреть статью, не сохраняя ее, - но в этом случае изменения тегов действительно сохраняются, даже если другие поля этого не делают.
(Возможно, уместно то, что если «а» - это новая статья, а не существующая, все ведет себя так, как я ожидал - ничего не сохраняется, пока я не вызову «a.save»)
У меня довольно неприятный обходной путь - я могу переопределить метод tag_ids = в моей модели, чтобы вместо этого заполнить переменную экземпляра и фактически сохранить связанные модели в обратном вызове before_save.
Но я бы хотел знать, как проще сделать это для каждой модели с отношением has_many, для которого я хотел бы создать средство предварительного просмотра.
У кого-нибудь есть какие-либо исправления / обходные пути / общие советы? Спасибо!