質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Q&A

解決済

1回答

732閲覧

セレクトボックスで、一度選択した情報が表示されないようにしたいです。

manami0419

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/10/02 10:02

編集2020/10/03 04:24

前提・実現したいこと

現在、railsでマッチングアプリを実装中です。
マッチしたユーザーをセレクトボックスで選択して、チャットルームへ遷移するという仕様です。
そこでチャットルームに存在するユーザーは、今後チャットルーム作成画面でセレクトボックス内に表示されないようにしたいです。
そうでないと同じユーザーのチャットルームが何個もできてしまうからです( ; ; )
こんな方法ってあるのでしょうか。。

該当のソースコード

こちらはマッチしたユーザーを表示しているセレクトボックスです。
@matchがマッチした全てのユーザーのユーザー情報を表しています。

html

1234<div class='chat-room-form__field--right'> 5 <select name="room[user_ids][]"> 6  <option value="">チャットするユーザーを選択してください</option> 7  <% @match.each do |match| %> 8   <option value=<%=match.id%>><%= match.nickname %></option> 9  <% end %> 10 </select> 11 <input name="room[user_ids][]" type="hidden" value=<%=current_user.id%>> 12</div> 131415

こちらは@matchに格納されているユーザー情報です。

[#<User id: 4, nickname: "さちこ", gender: "女", email: "oo@oo.oo", created_at: "2020-09-26 05:00:23", updated_at: "2020-09-26 05:00:23">, #<User id: 10, nickname: "さやか", gender: "女", email: "ss@ss.ss", created_at: "2020-09-27 05:09:51", updated_at: "2020-09-27 05:09:51">]

こちらはroomコントローラーです。
@matchを定義しています。

class RoomsController < ApplicationController  def index  @favorite_user_infos = current_user.favorite_user_infos #情報を取ってる  @favorite_users = current_user.user_info.favorite_users #ユーザーを取ってる  x = current_user.favorite_user_infos.pluck(:user_id)  y = current_user.user_info.favorite_users.ids  z = x & y  @match = User.where(id: z) end

この実装で使っているモデルは、Roomモデル、Userモデル、その二つの中間テーブルのRoomUserモデルです。
これはroomモデルです。

class Room < ApplicationRecord  has_many :room_users  has_many :users, through: :room_users  has_many :messages  validates :name, presence: true end

これはUserモデルです。

class User < ApplicationRecord  # Include default devise modules. Others available are:  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable  devise :database_authenticatable, :registerable,  :recoverable, :rememberable, :validatable  has_one :user_info  has_many :favorites  has_many :favorite_user_infos, through: :favorites, source: :user_info  has_many :room_users  has_many :rooms, through: :room_users  has_many :messages  validates :nickname, presence: true  validates :gender, presence: true end

これはRoomUserモデルです。

よろしくお願いします( ; ; ) class RoomUser < ApplicationRecord  belongs_to :room  belongs_to :user end

補足情報

selectボックスのオプションのdisabledを使うのかなと思いました。
ただ、「チャットルームに存在しているmatchは表示しない」という設定の仕方がわかりません。。

必要な情報がありましたら、なんでもおっしゃってください。
よろしくお願いいたします( ;∀;)

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

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

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

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

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

winterboum

2020/10/02 21:21

各modelの関連定義、 @matchを作っている部分 のcodeを
manami0419

2020/10/03 02:58

こちらはroomコントローラーです。 @matchを定義しています。 ``` class RoomsController < ApplicationController def index @favorite_user_infos = current_user.favorite_user_infos #情報を取ってる @favorite_users = current_user.user_info.favorite_users #ユーザーを取ってる x = current_user.favorite_user_infos.pluck(:user_id) y = current_user.user_info.favorite_users.ids z = x & y @match = User.where(id: z) end ``` この実装で使っているモデルは、Roomモデル、Userモデル、その二つの中間テーブルのRoomUserモデルです。 これはroomモデルです。 ``` class Room < ApplicationRecord has_many :room_users has_many :users, through: :room_users has_many :messages validates :name, presence: true end ``` これはUserモデルです。 ``` class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_one :user_info has_many :favorites has_many :favorite_user_infos, through: :favorites, source: :user_info has_many :room_users has_many :rooms, through: :room_users has_many :messages validates :nickname, presence: true validates :gender, presence: true end ``` これはRoomUserモデルです。 ``` よろしくお願いします( ; ; ) class RoomUser < ApplicationRecord belongs_to :room belongs_to :user end ```
winterboum

2020/10/03 03:30

ここに書くとベタになって読みにくいので、質問を編集して、そちらに移してください
manami0419

2020/10/03 04:26 編集

申し訳ありません。。 かしこまりました! 修正いたしました。 ご確認よろしくお願いいたします(>_<)
guest

回答1

0

ベストアンサー

やるべきことは 「『current_user が参加する room』に参加するUser」を求めてその id をz = x & y から引くことです。

一度に求める格好良いのはすぐには思いつかなかったので、とりあえず出来る(であろう)方法を。
current_user.rooms.map{|room| room.users.ids).flatten.uniq

の結果を zから引いてください。
ただこの方法は rooms の数だけDBにアクセスに行くのであまりよくはないですが、とりあえずの解として

current_user.rooms.includes(:users).map{|room| room.users.ids).flatten.uniq

が動けば、DBアクセスは1回になります。試してください

似た環境さっと作れなかったので、動くかどうか試してないですが
current_user.rooms.joins(:users).select("users.id as user_id").pluck(:user_id)
動けばちょっと格好良いかな

投稿2020/10/03 04:47

編集2020/10/03 04:52
winterboum

総合スコア23284

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

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

manami0419

2020/10/03 08:43

ご回答ありがとうございます(>_<) 「『current_user が参加する room』に参加するUser」を求めてその id をz = x & y から引くことです。 これについて、とりあえずroomsコントローラーに、 u = current_user.rooms.map{|room| room.users.ids).flatten.uniq a = u - z の2行を追加しました。 でもこの後どうしていいか全くわからないです( ; ; )
winterboum

2020/10/03 10:00

逆ですね a = z - u として @match = User.where(id: a)
manami0419

2020/10/03 11:08

@room = Room.new @favorite_user_infos = current_user.favorite_user_infos #情報を取ってる @favorite_users = current_user.user_info.favorite_users #ユーザーを取ってる x = current_user.favorite_user_infos.pluck(:user_id) y = current_user.user_info.favorite_users.ids z = x & y 消しています→# @match = User.where(id: z) 追加→u = 教えていただいた式 追加→a = z - u 追加→@match = User.where(id: a) これで上記3パターンで実装してみました。 一つ目、セレクトボックスがある画面に遷移した際にSyntaxErrorが起きました。 u = 教えていただいた式 の部分に網掛けされています。 二つ目、一つ目と同様にSyntaxErrorが起きました。同じところに網掛けされています。 三つ目、これはセレクトボックスがある画面に遷移した際に、ActiveRecord::StatementInvalid in RoomsController#new とエラーが出ました。その下に、Mysql2::Error: Column 'user_id' in field list is ambiguous と書かれており、一、二つ目同様、教えていただいた式のところに網掛けがされています。 どうしたらいいでしょうか?( ; ; )
winterboum

2020/10/03 11:20

current_user.rooms.map{|room| room.users.ids).flatten.uniq } とすべきところ ) になってました
winterboum

2020/10/03 11:20

ふたつ目も同じく
winterboum

2020/10/03 11:21

3つめ select("users.id as user_id").pluck(:user_id) を select("users.id as userid").pluck(:userid) に
manami0419

2020/10/03 11:39

一つ目、二つ目は成功しました! 三つ目は遷移した際にTypeErrorが出ました。その下に、wrong argument type String (expected Array)との記述があります。 解決していただき、ありがとうございます!( ´ ▽ ` ) この場合、2つ目を使った方がいいんでしょうか?
winterboum

2020/10/03 12:35

2つめのほうが良いですね
manami0419

2020/10/04 03:33

かしこまりました! 2つ目を記述させてもらいます! ご回答いただき本当にありがとうございました( ´ ▽ ` )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問