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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

947閲覧

RailsのWhereメソッドについてのエラー

hattin

総合スコア18

Ruby on Rails 5

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/03/27 01:49

#実現したいこと
rails6のAPIモードにて、同じ駅に登録したユーザー(free_users)から予定の入っていないユーザーが6人以上いる駅(active_stations)を絞り出し、同じ駅を持つ予定なしユーザー同士でチャットルームを形成しようとしています。
#エラー
先にエラー文を載せておきます。
エラー①

ruby

1NoMethodError (undefined method `free' for User (call 'User.connection' to establish a connection):Class

エラー②

ruby

1ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "free_users"

#該当コード
user_rooms_controller(チャットルームとユーザーを紐づける中間テーブル)

ruby

1def create 2#ここがエラー発生箇所ですーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 3エラー①の場合 @active_stations = Station.joins(:users).where("users.where({free: true}.count >= 6)") 4 5エラー②の場合  @active_stations = Station.joins(:users).where("users.where({free: true}.count >= 6)") 6------------------------------------------ 7 @active_stations.each do |station| #それぞれのセッティング可能駅について処理 8 9 room = Room.create(station_id: station.id) #1、セッティング可能駅についての部屋を作成 10 users = station.users.where(free: true) #同じセッティング可能駅を登録している予定なしユーザーを取得 11 selected_users = users.sample(6) #同じ駅を登録している予定なしユーザーからランダムで6人抽出 12 13 selected_users.each do |user| #予定なしユーザーを同じ部屋idを持つように処理 14 room.save 15 user_room = UserRoom.build!(user_id: user.id, room_id: room.id) 16 user.free = false 17 user.save 18 19 render json: { status: 'SUCCESS', message: 'Loaded user_rooms', data: user_room } 20 end 21 22 end 23 end

station.rb(ここでfree_usersを定義)

ruby

1def free_users 2 free_users = self.users.where(free: true) 3 return free_users 4end

#試したこと
エラー発生箇所を以下のようにいじったりしました。whereメソッドの使い方的に別で定義したfree_usersを使用することができないのはわかりました。

ruby

1@active_stations = Station.where(user: User.where(free: true))

ご教授よろしくお願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

…私も教わる側なのですが、少しでもお力になれればと思い、投稿させていただきます。
動かなかったり意図と違っていても呪わないでいただければ幸いです。

本件の処理、無理に一行にせずに分離すれば丸く収まったりしないでしょうか?

1:active_station_ids = User.where(free: true).pluck(station_id).uniqとか何やらで取り出したい駅のidを配列に叩き込む
2:@active_stations = Station.where(id: active_station_ids) とかとかで駅の一覧を引っ張り出す

最善策ではないと思うのですが、解決できずに沼にハマるよりは幾分か良いのではないかと思いまして…。
おかしかったらスルーしていただいて大丈夫です。

追伸:追記されているコードですが、@active_stations = Station.joins(:users).include(:users).where(users: {free: true}) とかで動いてくれませんでしたっけ??これが通ってくれたら一番スマートだと思うんですが…。
やはり現実世界は非情ですね。

投稿2020/04/08 18:00

take77

総合スコア130

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問