2012-03-29 8 views
0

ユーザーは投稿を作成できます。投稿にはコメントがあります。コメントは、ユーザーと投稿の両方に属している必要がありますが、必ずしも投稿を作成したユーザーである必要はありません。3つのモデル間でhas_many関係にidを設定する

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :comments 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 

もしそうなら、確実にするためのベストプラクティスは何か:

  1. user.comments.newを呼び出すことはできませんこれをモデル化するための最良の方法を以下の通りです。私はすべての新しい投稿は、それらが関連付けられているpostを使用して作成されたい。
  2. コメントを作成しているユーザーのidがそうでなければpost.comments.new

を呼び出すときに適切に設定され、この関係をモデル化するためのより良い方法は何ですか?

答えて

1

お使いのモデルは問題ありません。コメントの作成者を設定するには

、あなたはあなたのコントローラであることを行う必要があるだろう:

@comment = post.comments.new do |c| 
    c.user = current_user 
end 

ちょうどuser.comments.newを使用しないでください。なぜあなたはそれを使用することを不可能にしたいですか?

+0

モデルの構造を確認していただきありがとうございます。私はコントローラのようなことを計画していましたが、それが "レールの道"などと考えられていることを確認したかったのです。私はuser.comments.newを呼び出すことが不可能にする必要はありませんが、それを利用可能にしておく(すなわち、無益にするためにサルのパッチを当てるのではなく)。再度、感謝します。 –

+0

うん、それを残しても大丈夫です。また、新しいアクションや作成アクションで 'user.comments.new'を使用していますか?一般に、アソシエーションからオブジェクトを構築するときは、 'new'の代わりに' build'を使うべきです。最近のバージョンでは両方とも動作しますが、 'build'はオブジェクトを投稿のコメントコレクションに追加し、それをメモリに保持します。すべての詳細についてはわからないが、Googleの違いを検索して自分で決めることができる); – Robin

+0

右 - 私はnewbuildの違いを知っている。 –

関連する問題