Предположим, что у нас есть стандартные модели Post & Comment с наличием Сообщения accepts_nested_attributes_for :commments
и :autosave => true
набор.
Мы можем создать новое сообщение вместе с некоторыми новыми комментариями, например:
@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
из Комментария не работает, потому что на вышеупомянутый, он возвращает ноль, пока не сохраняют, происходит. В обратном вызове, конечно, я не делаю (и не был должен) иметь доступ к @post, только к сам рассматриваемого комментария.
Так: как я могу получить доступ к родительской модели вложенных ассоциаций новой записи, с точки зрения той вложенной модели ассоциации?
(FWIW, фактический образец, с которым я использую это, позволяет людям создавать явный "комментарий" и затем автоматически создаст "сообщение" для содержания его, если уже нет того. Я упростил этот пример, таким образом, это не характерно для моего кода несоответствующими способами.)
Мне кажется странным, что Rails не позволяет вам этого делать. Это также влияет на валидации в дочерней модели.
В трекере ошибок Rails есть тикет с большим количеством обсуждений и без разрешения:
И предлагаемое решение:
По сути, дело в том, что код вложенных атрибутов не устанавливает родительскую связь в дочерней записи.
Есть некоторые обходные пути, упомянутые во втором билете, на который я ссылался.
Я не думаю, что ты сможешь это сделать. С другой стороны, ваши проверки не должны давать сбоев, так как порядок транзакции создаст запись сообщения до сохранения комментария.