🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

705閲覧

railsで中間テーブルへの保存が行われない

tatsu-koharu

総合スコア4

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/12/01 07:19

前提・実現したいこと

初めて相談させて頂きます。
チャットアプリを制作したく現在進めておりますが、中間テーブルへのデータ保存でつまづいています。
今はこんなソール上で登録を行おうとしている状態ですが、ROLLBACKで返され保存できません。
最初はコントローラーの問題かと思っておりましたが、コンソールでも保存ができないので、アソシエーションの問題なのでしょうか?
ご教授のほど、よろしくお願いいたします。

発生している問題・エラーメッセージ

[12] pry(main)> Chat.create(name: "こは", user_ids: [1,2]) User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2) DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :nickname attribute in User model, pass `case_sensitive: true` option explicitly to the uniqueness validator. (called from __pry__ at (pry):12) (0.2ms) BEGIN User Exists? (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`nickname` = BINARY '・・' AND `users`.`id` != 1 LIMIT 1 DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :email attribute in User model, pass `case_sensitive: true` option explicitly to the uniqueness validator. (called from __pry__ at (pry):12) User Exists? (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'ggg@ooo.com' AND `users`.`id` != 1 LIMIT 1 DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :nickname attribute in User model, pass `case_sensitive: true` option explicitly to the uniqueness validator. (called from __pry__ at (pry):12) User Exists? (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`nickname` = BINARY '::' AND `users`.`id` != 2 LIMIT 1 DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :email attribute in User model, pass `case_sensitive: true` option explicitly to the uniqueness validator. (called from __pry__ at (pry):12) User Exists? (0.5ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'tatsch@gmail.com' AND `users`.`id` != 2 LIMIT 1 (0.2ms) ROLLBACK => #<Chat:0x00007fc69305e400 id: nil, name: "こは", created_at: nil, updated_at: nil>

該当のソースコード

//user.rb class User < ApplicationRecord has_many :user_chats has_many :chats, through: :user_chats end
//chat.rb class Chat < ApplicationRecord has_many :user_chats has_many :users, through: :user_chats end
//user_chat.rb class UserChat < ApplicationRecord belongs_to :user belongs_to :chat end

試したこと

[13] pry(main)> Chat.create (0.4ms) BEGIN Chat Create (0.4ms) INSERT INTO `chats` (`created_at`, `updated_at`) VALUES ('2020-12-01 07:10:15.478722', '2020-12-01 07:10:15.478722') (0.7ms) COMMIT => #<Chat:0x00007fc688622720 id: 4, name: nil, created_at: Tue, 01 Dec 2020 07:10:15 UTC +00:00, updated_at: Tue, 01 Dec 2020 07:10:15 UTC +00:00>

chatのみの保存はできます。

[14] pry(main)> UserChat.create(chat_id: 1, user_id: 1) (0.3ms) BEGIN User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 Chat Load (0.4ms) SELECT `chats`.* FROM `chats` WHERE `chats`.`id` = 1 LIMIT 1 UserChat Create (0.4ms) INSERT INTO `user_chats` (`user_id`, `chat_id`, `created_at`, `updated_at`) VALUES (1, 1, '2020-12-01 07:12:33.202836', '2020-12-01 07:12:33.202836') (1.1ms) COMMIT => #<UserChat:0x00007fc6930a6070 id: 1, user_id: 1, chat_id: 1, created_at: Tue, 01 Dec 2020 07:12:33 UTC +00:00, updated_at: Tue, 01 Dec 2020 07:12:33 UTC +00:00>

user_chatのみの保存もできます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

ruby:2.6.5
rails:6.0.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Chat.create(name: "こは", user_ids: [1,2]) これは
Chat.create(name: "こは" してさらにそれをUser 1,2 と関連付けたいということですね。
色々有りますが例えば
chat = Chat.create(name: "こは") cat.users = User.where(id: [1,2])

投稿2020/12/01 07:43

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu-koharu

2020/12/01 08:10

ありがとうございます。 保存する事ができました。 アソシエーションを組んで、through記述しておけば勝手に振り分けられるとばかり考えておりました。 とても助かりました。 コントローラーへの反映も頑張って取り組んでみます。
winterboum

2020/12/01 08:12

勝手に振り分けさせる方法もありますが、パラメータの記述が複雑になりますし、関連定義に追加が必要です。 関連も同時に保存する あたりで検索してください
tatsu-koharu

2020/12/01 08:24

重ね重ねありがとうございます。 一度関連の検索も行なってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問