今日は現役テックキャンプ生のアプリ開発Day8分を記述します。今回は中間テーブルへのデータの保存の仕方について記述します。まず、中間テーブルの説明から始めます。
中間テーブルとは?
テーブル間で多対多のアソシエーションが発生する時、間に交通整理員を置くようなイメージで中間テーブルというものを作成します。中間テーブルに関しては下のメチャクチャわかりやす記事を参考にしてください
今回のDB設計
今回は私自身のアプリ開発で利用しているUserとRoom(userが参加する場所)のテーブルを例に説明します。2つのテーブルのアソシエーションを確認します。
・userは複数のroomに参加できるので、userは複数のroomを持っていると言えます。
・roomには複数のuserが参加しているので、roomは複数のuserを持っていると言えます。
以上より、userとroomは多対多のアソシエーションなので、中間テーブルとしてuser_roomを作成します。
マイグレーションファイル
中間テーブルのみ記述します。
def change
create_table :user_rooms do |t|
t.references :user, foreign_key: true
t.references :room, foreign_key: true
t.timestamps
end
end
モデルへアソシエーションの記述
簡易に記述します。
#中間テーブルのUser_room
belongs_to :user
belongs_to :room
#userテーブル
has_many :user_rooms
has_many :rooms ,through: :user_rooms
#roomテーブル
has_many :user_rooms
has_many :users, through: :user_rooms
中間テーブルへデータを保存する方法
結論から言うとparamsにuser_ids:[id,id2・・・]というカラムを追加すると保存できます。railsコンソールで確認していきましょう。まず、コンソールを起動します。
rails c
次に、ユーザーを複数作った上で、roomを作成します。
Room.create(カラム名:"test",カラム名2:"test", user_ids:[ユーザーID,ユーザー2人目のID])
以上で、中間テーブルにデータが保存できたはずです。
参考になるかわかりませんが、実際にコントローラー内に記述したコードを下に載せます。
def create
@room = Room.new(room_params)
@room.save
redirect_to root_path(@room)
end
private
def room_params
params.require(:room).permit(:room_name).merge(maker_user: current_user.nickname, user_ids: [current_user.id])
end
以上、お読みいただきありがとうございます。