teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントへの回答

2021/03/12 07:31

投稿

neko_daisuki
neko_daisuki

スコア2090

answer CHANGED
@@ -23,4 +23,23 @@
23
23
  INNER JOIN `user_languages` ON `user_langages`.`user_id` = `users`.`id`
24
24
  INNER JOIN `languages` ON `languages`.`id` = `user_languages`.`language_id`
25
25
  WHERE `languages`.`id` IN (1, 2)
26
- ```
26
+ ```
27
+
28
+
29
+ ### 追記
30
+
31
+ いまテーブルが用意できないので確認できないのですが、これでどうでしょう
32
+
33
+ ```ruby
34
+ User.select("users.*, COUNT(*) AS languages_count")
35
+ .joins(:user_languages)
36
+ .where(user_languages: { language_id: params[:language_ids] })
37
+ .group("user_languages.user_id")
38
+ .having(languages_count: params[:language_ids].length)
39
+ ```
40
+
41
+ 1.中間テーブルの language_id が params[:language_ids] に含まれるものに絞り込む
42
+ 2.中間テーブルのuser_idでグループ化してその数をカウント(ユーザーごとの一致したlanguage数)
43
+ 3.カウントがparams[:language_ids]の数と一致するか(完全に含むか)で絞り込む
44
+
45
+ という動作にしているつもりです。