2011-02-07 42 views
4

私はブログのように、ユーザー、投稿、コメントの3つのモデルでアプリケーションを作成しようとしています。予想通り、コメントはユーザーと投稿の両方に属します。 Comment.rbユーザ/投稿/コメントのレール関連

belongs_to :user 
belongs_to :post 

User.rb

has_many :comments 
has_many :posts 

Post.rb

has_many :comments 
belongs_to :user 

そして私は、コメントを作成しようとしました:

は、私は、次の関連付けを使用しました使用: @ user.comments.create

ただし、これはユーザーとのコメントに関連しますが、投稿とは関連しません。私は、コメントをユーザと投稿の両方に関連付けてほしいと思っています。そうする方法はありますか?あるいは私は間違った団体を使いましたか?

私はuser_idまたはpost_idを手動で設定することをお勧めしないかもしれないので、両方のIDはattr_accessibleにありません。それが正しいかどうかわからない。

ありがとうございました!

答えて

2

特にpost_idは設定する必要はありません。試してください@user.comments.create(:post => @post)

+0

これは、あなたが望むように聞こえます - 多態性の答えは間違った質問のためでした...そして、作成時にハッシュを介してこれらの属性を設定できるが、更新時にユーザーによる変更からそれらを保護できるようにしたい場合は、 attr_readonly:[link](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-attr_readonly)。 –

+0

私が試したとき: '@ user.comments.create(:content =>" hi "、:post => @post)'、 '#<コメントID:nil、user_id:1、post_id:nil、content : "hi"、created_at:nil、updated_at:nil> '。 '@ post'は'#<投稿ID:4、タイトル: "fooTitle"、コンテンツ: "fooContent"、user_id:1、created_at: "2011-02-07 20:13:43"、updated_at: "2011- 02-07 20:13:43 "。投稿後の関連付けがまだ行方不明だったようです。何が間違っているのか分かりません。ありがとう! – garthcn

+0

奇数私はバーのUser、Post、Commentクラスのクラスを持つテストアプリを作成しました。コンソールを通して 'user = User.create;ポスト=ポスト。 #<コメントID:1、user_id:1、post_id:1、created_at: "2011-02-08 09:46:53"、updated_at: "2011- 02-08 09:46:53 ">'あなたのコメントはあなたのDBにあるかどうか確認できますか?それはリロードが必要ですか?あなたが行ったことを正確に投稿できますか? – Chowlett

0

コメントを複数のモデルに関連付ける必要がある場合は、polymorphic associationと呼びます。あなたはそれのためにhas_many_polymorphsプラグインを見ることができます。私はあなたがレール3を使用していると推定、あなたは次のことを試すことができます。

あなたは、モジュールが定義されていることができ、このようなlib/commentable.rbフォルダに:

module Commentable 
    def self.included(base) 
     base.class_eval do 
      has_many :comments, :as => commentable 
     end 
    end 
end 

あなたはそれが多型であると言うべきでコメント・モデルでは両方で

belongs_to :commentable, :polymorphic => true 

、あなたは以下を追加することができますポストとユーザーモデル:

has_many :comments, :as => :commentable, :dependent => :delete_all 

のRails 3にlibフォルダがデフォルトでロードされていない、ので、あなたのapplication.rbにそれをロードするためのRailsを依頼する必要があります。

config.autoload_paths += %W(#{config.root}/lib) 

さて、コメントが多型であり、任意の他のモデルは、それに関連することができます。これはすべきです。

+0

これは、一度にコメントを「User」と「Post」のどちらか一方にのみ関連付けることができ、OPの意図とは違います。 – Chowlett

関連する問題