2

他の 2 つのモデルに属するモデルのオブジェクトを作成する方法はありますか。たとえば、多くの投稿を持っているユーザーがいて、多くのコメントを持つことができる投稿があり、コメントがユーザーと投稿の両方に属している場合です。post.comments.create() を実行すると投稿のみがコメントに関連付けられ、user.comments.create() を実行するとユーザーが関連付けられます。両方をコメントに関連付けたい場合、その方法は何ですか。ポリモーフィック アソシエーションを使用できることはわかっていますが、他にも方法はありますか?

4

3 に答える 3

3

まず最初に、アソシエーションについて話しているときは、そうではないことに注意する必要がありbuildますcreate。必要なことを行うための非常に簡単な方法は do です

    class Comment < ActiveRecord::Base
      belongs_to :user
   end

User に関係の反対側を追加することを忘れないでください。

 class User < ActiveRecord::Base
  has_many :comments
 end

これで、コメント テーブルにフィールド user_id を作成したに違いないことがわかりました。そうでない場合は、この移行で追加する必要があります。

rails g migration add_user_id_to_comments user_id:string

今、するrake db:migrate

代わりに、より良い方法は になります。

モデル コメントの作成中にユーザーを追加します: このような移行行の参照

rails g model Comment text:string post:references user:references

このようにして、リレーションの片側が自動的にモデルに追加され、user_id フィールドと post_id フィールドが自動的にコメント テーブルに追加されます。

あなたの質問に戻ります。次のような方法が他に見つからない場合は、隠しフィールドにユーザー ID を渡します。

<%= hidden_field_tag "userid", current_user.id%>

現在のユーザーが定義されていると思います。これで、このようなコメントのコントローラーでこれを受け入れることができます

If params[:userid]
 user_id = params[:userid]
end

これは、コメント コントローラーの create アクションの save 関数の直前に含めることができます。

お役に立てれば

乾杯!

于 2013-09-24T05:31:18.047 に答える
2

両方のモデルで belongs_to を使用できます。唯一の違いは、コメントを作成するときに、作成していないモデルの ID を明示的に言及する必要があることです。例を挙げます:

class Comment
  belongs_to :user
  belongs_to :post
end

comment = post.comments.create(user_id: some_user_id)

投稿コメント リレーションを介してコメントを作成したため、投稿 ID がコメントのpost_id属性に自動的に挿入されます。のIDを持つユーザーを返すuser_idので、特に言及しました。comment.usersome_user_id

編集

paramsコメントを作成するとき、ハッシュでコメント属性を使用するには、次を使用します。

comment = post.comments.build(params[:comment])
comment.user_id = some_user_id
comment.save
于 2013-09-24T05:29:01.623 に答える
0

次のようにコメントを作成すると、さらに直感的になる場合があります。

comment = Comment.create(user_id: 関連付けたいユーザー.id, post_id: 関連付けたいユーザー.id)

于 2015-08-17T17:59:51.660 に答える