@kouki2000 (今村 光基)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

中間テーブルにデータが保存されません

解決したいこと

チャット機能実装時に中間テーブルを作成してコンソール上でデータ保存を試したところ保存されません。
保存が出来ない理由と解決方法を知りたいです。

発生している問題・エラー

作成済みのusersテーブルとroom_usersテーブルに下記のようにコンソールでrails cコマンドから実行してもテーブルに保存されません。
image.png

該当するソースコード

ruby app/models/room.rb
class Room < ApplicationRecord
  has_many :room_users, dependent: :destroy
  has_many :users, through: :room_users
  has_many :messages, dependent: :destroy
end
models/room_user.rb
class RoomUser < ApplicationRecord
  belongs_to :user
  belongs_to :room
end
controllers/rooms_controller.rb
class RoomsController < ApplicationController

  def new
    @room = Room.new
  end

  def create
    @room = Room.new(room_params)
    if @room.save
      redirect_to root_path
    else
      render :new
    end
  end

  private

  def room_params
    params.require(:room).permit(:name).merge(user_ids: [])
  end

end

自分で試したこと

以前作成した別のWebアプリで同じようにテーブル作成、アソシエーション定義した時はこのように保存できました。
image.png
テーブル作成手順とアソシエーション記述は全く同じはずなのですが・・・
今回はダメな理由がわかりません。

0 likes

2Answer

直接回答にはなりませんが以下はどのようになりますか?

room = Room.new(name: "ルーム1", user_ids: [1, 2])
room.save
p room.errors.full_messagess
0Like

Comments

  1. 言葉足らずで申し訳ございませんでした。
    上記はrails cで実施していただくことを想定したものでした。

    エラーメッセージを見るとRoomモデル(≒roomsテーブル)にnameがないと言われています。
    migrationはあっているでしょうか?
    また`validate: false`で対応したとのことですが、根本的には解決していないように思えます。

    `has_many :users`のバリデーションで引っかかるということはUser(id = 1, id = 2)が存在しないなどが考えられますが、DBの整合性は確認できますか?

roomモデルのバリデーションに以下のようにvalidate: falseを追加することで解決できました!

has_many :users, through: :room_users, validate: false
0Like

Your answer might help someone💌