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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1406閲覧

中間テーブルの値を出力条件に加えたい(Rails)

tomtom1

総合スコア168

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/20 12:45

編集2021/04/21 19:21

###知りたいこと
中間テーブルの値を条件に、所属グループを出力したいです。
ユーザーはグループに所属することができます。その関係を中間テーブルで繋いでいます。

以下の様に記載すると、自分の所属グループの一覧は出力されます。
しかし、今回は更にgroup_usersモデルのcreated_atが今日の場合という条件を加えたいです。

@groups = current_user.groups

加えたい内容(以下の様な条件)

GroupUser.where(mydate: Date.today)

schema

1 create_table "group_users", force: :cascade do |t| 2 t.integer "group_id" 3 t.integer "user_id" 4 t.datetime "mydate" 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 end 8 create_table "groups", force: :cascade do |t| 9 t.string "title" 10 t.datetime "created_at", null: false 11 t.datetime "updated_at", null: false 12 end 13 create_table "users", force: :cascade do |t| 14 t.string "name" 15 t.datetime "created_at", null: false 16 t.datetime "updated_at", null: false 17 end

お分かりの方、ぜひ宜しくお願いいたします。
###追記
関係性
イメージ説明

model

1class User < ApplicationRecord 2 has_many :groups, through: :group_users 3 has_many :group_users 4end 5 6class Group < ApplicationRecord 7 has_many :users, through: :group_users 8 has_many :group_users 9end 10 11class GroupUser < ApplicationRecord 12 belongs_to :group 13 belongs_to :user 14end

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

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

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

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

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

guest

回答1

0

ベストアンサー

eager_loadを使って結合する事で、子テーブルをwhereで絞り込むことが出来ます。
貼られている質問内容ですとアソシーエーションが見えないので具体例は示せませんが、

例えば良くあるuserとtweetsの関係だと以下の様な形で書けます。

ruby

1User.eager_load(:tweets).where(tweets: {created_at: Date.today})

投稿2021/04/20 16:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tomtom1

2021/04/21 11:35

少しわかりづらかったかもしれないので、"group_users"のcreated_at→"mydate"に変更しました! "group_users"の中間テーブルは、userがgroupに所属した際に、user_idとgroup_idを保持する"group_users"が作成され、そのカラムが存在することでuserはgroupに所属していることになります。 current_user.groupsで所属しているグループ一覧を取り出せますが、今回新たにwhereメソッドで取り入れたいのは、子テーブルではなく、その中間テーブル"group_users"の"mydate"がDate.todayなのか?です。
退会済みユーザー

退会済みユーザー

2021/04/21 18:34

中間テーブル=二つのテーブル双方の子テーブルです。 なので、子テーブルの絞り込みの方法がそのまま使えます。 アソシエーションもそのように記載する必要がありますが。
tomtom1

2021/04/21 19:21 編集

申し訳ありません。まだ回答にたどり着かないです。 認識があっているか、追記でUser、Group、GroupUserの関係性がわかるグラフとmodelを追加しました。 再度確認ですが、中間テーブルの値を出力条件に加えたいというのが私の質問です。 ご回答頂いた、以下の内容を元にしますと、 User.eager_load(:tweets).where(tweets: {created_at: Date.today}) 最初の部分を、Group.eager_load(:users)とします。 しかし、次のwhere以降が.where(GroupUser: ...)というのが成り立たないと思います。 そしてGroup.eager_load(:users).where(GroupUser: {created_at: Date.today})ではやはりエラーです。
tomtom1

2021/04/21 19:54

.where(tweets: {created_at: Date.today})の部分が子テーブル(tweets)ではなく、中間テーブルのGroupUser(今回でいう)から条件をかけれると、問題は解決します。
退会済みユーザー

退会済みユーザー

2021/04/22 05:35

Group.eager_load(:users).where(group_users: {created_at: Date.today, user_id: current_user.id}) これで出来ませんか?
退会済みユーザー

退会済みユーザー

2021/04/22 05:37

> Group.eager_load(:users).where(GroupUser: {created_at: Date.today})ではやはりエラーです。 これは当然エラーになると思います。  :GroupUserというシンボルが何を示しているのかRailsが判出来ないからです。
退会済みユーザー

退会済みユーザー

2021/04/22 05:42

なんか中間テーブルという表現にすごくこだわってらっしゃいますが、今回で言うと、 group_usersテーブルはusersテーブルとgroupsテーブル双方の子テーブルです。 双方のテーブルを紐づけるために双方の子テーブルであるテーブルを中間テーブルと呼びます。 なので子テーブルでの絞り込みを行う方法を調べればその方法が絶対使えるはずです。 > 今回新たにwhereメソッドで取り入れたいのは、子テーブルではなく、その中間テーブル"group_users"の"mydate"がDate.todayなのか?です。 中間テーブルは必ず子テーブルであるので、「子テーブルではなく」ではなく子テーブルなんです。
tomtom1

2021/04/22 13:38

ありがとうございます!無事把握し、解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問