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

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

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

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

746閲覧

親の親の親のデータを検索条件に含めたい

nagi166

総合スコア23

Ruby on Rails 5

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

2クリップ

投稿2021/04/13 07:30

モデルのりレーションが、

親 > 子 country(国) > user(人) > subject(教科) > unit(単元) > question(問題)

となっているとします。(例なので構造が悪いとかには目を瞑ってください)

次の検索条件に当てはまるquestionの件数を取得したいのですが、どうすればよいのでしょうか?

  • countryareaカラムが3
  • userid20
  • questionのlanguageカラムで重複しているデータを省く

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

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

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

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

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

mather

2021/04/13 07:37

質問者自身がどうやれば実現できるか調べたこと、試したことを記載してください。このままだと丸投げの質問です。
nagi166

2021/04/13 07:50

``` Question.select(:user_id).distinct.where(user_id: 20).count ``` とすることで、下二つの条件はクリアできました。 しかし、`country`の`area`が`3`の絞り込みができていないです。 questionモデルではcountryのidを含んでおらず、単純に`.where(country: 3)`とはできないため、 ``` Question.select(:user_id).distinct.where(user_id: 20).joins(:unit).joins(:subject).joins(:user).joins(country).where(area: 3).count ``` とjoinで親モデルをつなげていって検索しようとしたのですが、`no implicit conversion of Symbol into String`のエラーになりました。 ``` Question.select(:user_id).distinct.where(user_id: 20).joins(:unit) ``` まではエラーなく動きました。 親のカラムを検索条件に含める記事はあったのですが、親の親以上の場合はなかったため、困っています。
yambejp

2021/04/13 09:20

RDB側でカウントをしたいのでしょうか? テーブルの構造とサンプルデータがあれば回答できるかもしれませんが 木構造の評価は入れ子集合モデルが効率的かもしれません
guest

回答1

0

ベストアンサー

これでどうでしょうか?

rb

1language_count = Question.joins(unit: { subject: { user: :country } }) 2 .where(country: { area: 3 }) 3 .where(user: { id: 20 }) 4 .distinct 5 .count(:language)

生成されるSQLは以下の通りです。

sql

1 (0.4ms) 2 SELECT COUNT(DISTINCT "questions"."language") 3 FROM "questions" 4 INNER JOIN "units" ON "units"."id" = "questions"."unit_id" 5 INNER JOIN "subjects" ON "subjects"."id" = "units"."subject_id" 6 INNER JOIN "users" user ON user."id" = "subjects"."user_id" 7 INNER JOIN "countries" country ON country."id" = user."country_id" 8 WHERE "country"."area" = ? AND "user"."id" = ? [["area", 3], ["id", 20]]

投稿2021/04/13 09:36

編集2021/04/13 10:08
shinoharat

総合スコア1685

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

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

shinoharat

2021/04/13 09:51

失礼しました。 質問文にちゃんと「次の検索条件に当てはまるquestionの《件数》を取得したい」と書いてありましたね。 回答を修正しますので少々お待ちください。
shinoharat

2021/04/13 09:55

回答を修正しました。 (修正前は language を文字列の配列で取得するコードを書いていました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問