他の 2 つのモデルに属するモデルのオブジェクトを作成する方法はありますか。たとえば、多くの投稿を持っているユーザーがいて、多くのコメントを持つことができる投稿があり、コメントがユーザーと投稿の両方に属している場合です。post.comments.create() を実行すると投稿のみがコメントに関連付けられ、user.comments.create() を実行するとユーザーが関連付けられます。両方をコメントに関連付けたい場合、その方法は何ですか。ポリモーフィック アソシエーションを使用できることはわかっていますが、他にも方法はありますか?
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 関数の直前に含めることができます。
お役に立てれば
乾杯!
両方のモデルで 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.user
some_user_id
編集
params
コメントを作成するとき、ハッシュでコメント属性を使用するには、次を使用します。
comment = post.comments.build(params[:comment])
comment.user_id = some_user_id
comment.save
次のようにコメントを作成すると、さらに直感的になる場合があります。
comment = Comment.create(user_id: 関連付けたいユーザー.id, post_id: 関連付けたいユーザー.id)