Предположим, у нас есть стандарт Post & Комментировать модели с сообщением accepts_nested_attributes_for :commments
и :autosave => true
.Rails: Как я могу получить доступ к родительской модели вложенных ассоциаций новой записи?
Мы можем создать новый пост вместе с некоторыми новыми комментариями, например:
@post = Post.new :subject => 'foo'
@post.comments.build :text => 'bar'
@post.comments.first # returns the new comment 'bar'
@post.comments.first.post # returns nil :(
@post.save # saves both post and comments simultaneously, in a transaction etc
@post.comments.first # returns the comment 'bar'
@post.comments.first.post # returns the post 'foo'
Однако, мне нужно, чтобы иметь возможность различать изнутри комментарий (например, от его before_save или функции проверки) между
- этот комментарий не привязан к столбу (который является недействительным)
- этого комментарий прикреплен к неспасенным посту (который действует)
К сожалению, просто вызов self.post
из комментария не работает, потому что в соответствии с ним он возвращает nil до тех пор, пока не произойдет сохранение. Разумеется, в обратном вызове я не (и не должен) иметь доступ к @post, только к самому себе из рассматриваемого комментария.
Итак: как я могу получить доступ к родительской модели вложенных ассоциаций новой записи, с точки зрения этой модели вложенной ассоциации?
(FWIW, фактический образец, с помощью которого я использую это, позволяет людям создавать голый «комментарий», а затем автоматически создаст «сообщение», чтобы его содержать, если его еще нет. Я упростил это например, поэтому это не относится к моему коду неуместными способами.)
Как это сделать? Вы не хотите устанавливать столбец parent_id, поэтому вам придется добавить некоторые скрытые свойства для ребенка? – MattMcKnight
Вы можете установить атрибут (например, родительский, дочерний) без установки необходимых _ids. Вот как это делает вложенную модель сбережения в настоящее время - у нее просто есть этот недостаток не быть рекурсивным. – Sai
@Sai после опубликованных ссылок, я вижу, что это может быть достигнуто с помощью опции 'inverse_of'. – artificis