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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2044閲覧

rails 中間テーブルにないもの

ds-kawasaki

総合スコア35

Ruby on Rails 5

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/07/06 07:01

前提・実現したいこと

Userが複数のGroupに参加できるように中間テーブルUserGroupを持っています。
どのグループにも参加していないUserの一覧を作りたいです。
全Userに対してgropus.empty?だとsql数が多く非効率なので、いい方法があれば教えてください。

rails

1class User < ActiveRecord::Base 2 has_many :user_groups 3 has_many :groups, :through => :user_groups 4end 5 6class Group < ActiveRecord::Base 7 has_many :user_groups 8 has_many :users, :through => :user_groups 9end 10 11class UserGroup < ActiveRecord::Base 12 belongs_to :user, :foreign_key => 'user_id' 13 belongs_to :group, :foreign_key => 'group_id' 14end

画面イメージ

■ ばななグループ 佐藤・鈴木・田中 ■ いちごグループ 鈴木・西村 ■ 未所属 小川・松本・森・山本

該当のソースコード

rails

1content = ''.html_safe 2groups = Group.all 3groups.each do |group| 4 content << '■ ' << content_tag(:span, group.name) 5 group.users.each do |user| 6 content << content_tag(:span, user.name) 7 end 8end 9 10content << '■ 未所属' 11all_users = User.all 12all_users.each do |user| 13 if user.groups.empty? 14 content << content_tag(:span, user.name) 15 end 16end

試したこと

中間テーブルに登録されていないものを取得するクエリを知りたいです。
下記だと何かのグループに所属しているUserになってしまいます。

rails

1content << '■ 未所属' 2independents = User.joins(:user_groups) 3 .where.not(user_groups: {user_id: 'any'}) 4independents.each do |user| 5 content << content_tag(:span, user.name) 6end

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

ruby 2.6.7
rails 5.2.4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

中間テーブルに登録されていないものを取得するクエリを知りたいです。

SQLではNot Existsを用いて判断します。

SQL

1select * from user 2where not exists( 3 select 1 from usergroup 4 where user_id=user.id 5 )

railesでの実装は以下を参考に
ActiveRecordでサブクエリ+NOT EXISTSを発行

投稿2021/07/06 08:25

sazi

総合スコア25327

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

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

ds-kawasaki

2021/07/07 04:24

not existsとArelの情報ありがとうございます。 ```rails content << '■ 未所属' condition = UserGroup.arel_table .where(UserGroup .arel_table[:user_id].eq(User.arel_table[:id])) .project("'X'") .exists .not independents = User.where(condition) independents.each do |user| content << content_tag(:span, user.name) end ``` こんな感じの実装となりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問