2009-12-13 4 views
5

Postがaccepts_nested_attributes_for :commments:autosave => trueと設定されたPostモデルのPostモデルが&コメントモデルであるとします。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や検証関数から)

とのコメントの中から区別できるようにする必要があります。

は、我々は例えば、いくつかの新しいコメントと一緒に、新しいポストを作成することができます

    このコメントは、このコメントは、(有効である) 保存されていない投稿に添付された(無効である)ポスト
  1. に接続されていない

残念ながら、上記の理由で、保存後になるまでnilを返すため、残念ながらCommentからself.postを呼び出すだけでは機能しません。コールバックでは、私は@postにアクセスすることはできません(そして、そうでなければなりません)。

So:ネストされた関連モデルの観点から、新しいレコードのネストされた関連付けの親モデルにアクセスするにはどうすればよいですか?

(FWIW、実際のサンプルではこれを使用して、裸の "コメント"を作成することができます)、それがない場合は自動的に "投稿"を作成します。例のように私のコードには関係ない方法では具体的ではありません)。

答えて

5

Railsがあなたにこれをさせてくれるのは奇妙だと思います。また、子モデルの検証にも影響します。

Nested attributes validations circular dependency

提案解像度:

nested models: build should directly assign the parent

多くの議論と、この程度のRailsのバグトラッカーでいない解像度でチケットがあります

基本的には、ネストされた属性コードは子レコードの親関連を設定しません。

リンク先の2番目のチケットにはいくつかの回避策があります。

+0

どうすればよいですか? parent_id列を設定したくないので、子供にいくつかの隠しプロパティを追加する必要がありますか? – MattMcKnight

+0

必須の_idsを設定せずに属性(親、子供など)を設定できます。これは現在、ネストされたモデルの保存方法です。再帰的ではないというこの欠陥があります。 – Sai

+0

@Saiはリンクをたどった後、 'inverse_of'オプションを使ってこれを実現することができます。 – artificis

0

私はあなたがこれを行うことはできないと思います。一方、トランザクションの順序でコメントを保存する前にポストレコードが作成されるため、検証は失敗してはなりません。

関連する問題