Направляющие: Как я могу получить доступ к родительской модели вложенных ассоциаций новой записи?

Предположим, что у нас есть стандартные модели 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 или функций проверки) между

  1. этот комментарий не присоединен к сообщению (который недопустим),
  2. этот комментарий присоединен к несохраненному сообщению (который допустим),

К сожалению, просто вызов self.post из Комментария не работает, потому что на вышеупомянутый, он возвращает ноль, пока не сохраняют, происходит. В обратном вызове, конечно, я не делаю (и не был должен) иметь доступ к @post, только к сам рассматриваемого комментария.

Так: как я могу получить доступ к родительской модели вложенных ассоциаций новой записи, с точки зрения той вложенной модели ассоциации?

(FWIW, фактический образец, с которым я использую это, позволяет людям создавать явный "комментарий" и затем автоматически создаст "сообщение" для содержания его, если уже нет того. Я упростил этот пример, таким образом, это не характерно для моего кода несоответствующими способами.)

6
задан Sai 13 December 2009 в 09:47
поделиться

2 ответа

Мне кажется странным, что Rails не позволяет вам этого делать. Это также влияет на валидации в дочерней модели.

В трекере ошибок Rails есть тикет с большим количеством обсуждений и без разрешения:

Вложенные валидации атрибутов круговой dependency

И предлагаемое решение:

вложенные модели: сборка должна напрямую назначить parent

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

Есть некоторые обходные пути, упомянутые во втором билете, на который я ссылался.

6
ответ дан 17 December 2019 в 02:29
поделиться

Я не думаю, что ты сможешь это сделать. С другой стороны, ваши проверки не должны давать сбоев, так как порядок транзакции создаст запись сообщения до сохранения комментария.

0
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: