2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

中間テーブルへのデータの保存の仕方

Posted at

今日は現役テックキャンプ生のアプリ開発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]) 

以上で、中間テーブルにデータが保存できたはずです。

参考になるかわかりませんが、実際にコントローラー内に記述したコードを下に載せます。

controllor内部
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

以上、お読みいただきありがとうございます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?