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や検証関数から)
とのコメントの中から区別できるようにする必要があります。は、我々は例えば、いくつかの新しいコメントと一緒に、新しいポストを作成することができます
-
このコメントは、このコメントは、(有効である)
保存されていない投稿に添付された(無効である)ポスト
- に接続されていない
残念ながら、上記の理由で、保存後になるまでnilを返すため、残念ながらCommentからself.post
を呼び出すだけでは機能しません。コールバックでは、私は@postにアクセスすることはできません(そして、そうでなければなりません)。
So:ネストされた関連モデルの観点から、新しいレコードのネストされた関連付けの親モデルにアクセスするにはどうすればよいですか?
(FWIW、実際のサンプルではこれを使用して、裸の "コメント"を作成することができます)、それがない場合は自動的に "投稿"を作成します。例のように私のコードには関係ない方法では具体的ではありません)。
どうすればよいですか? parent_id列を設定したくないので、子供にいくつかの隠しプロパティを追加する必要がありますか? – MattMcKnight
必須の_idsを設定せずに属性(親、子供など)を設定できます。これは現在、ネストされたモデルの保存方法です。再帰的ではないというこの欠陥があります。 – Sai
@Saiはリンクをたどった後、 'inverse_of'オプションを使ってこれを実現することができます。 – artificis