[解決済み] アソシエーションのカウントが0より大きいレコードをすべて検索する
2022-05-16 13:22:46
質問
簡単なことだと思っていたのですが、そうではなさそうです。
私は多くの欠員があるプロジェクトモデルを持っています。
class Project < ActiveRecord::Base
has_many :vacancies, :dependent => :destroy
end
私は少なくとも1つの空室を持つすべてのプロジェクトを取得したいです。 こんな感じでやってみました。
Project.joins(:vacancies).where('count(vacancies) > 0')
と書いてありますが
SQLite3::SQLException: no such column: vacancies: SELECT "projects".* FROM "projects" INNER JOIN "vacancies" ON "vacancies"."project_id" = "projects"."id" WHERE ("projects"."deleted_at" IS NULL) AND (count(vacancies) > 0)
.
どのように解決するのですか?
joins
はデフォルトで内部結合を使用するので
Project.joins(:vacancies)
を使用すると、事実上、関連する空室を持つプロジェクトのみを返します。
UPDATE
コメントで @mackskatz さんから指摘があったように
group
節がない場合、上記のコードでは、複数の空きがあるプロジェクトについて、重複したプロジェクトが返されます。 重複を削除するには
Project.joins(:vacancies).group('projects.id')
UPDATE
また、@Tolsee さんのご指摘のように
distinct
.
Project.joins(:vacancies).distinct
例として
[10] pry(main)> Comment.distinct.pluck :article_id
=> [43, 34, 45, 55, 17, 19, 1, 3, 4, 18, 44, 5, 13, 22, 16, 6, 53]
[11] pry(main)> _.size
=> 17
[12] pry(main)> Article.joins(:comments).size
=> 45
[13] pry(main)> Article.joins(:comments).distinct.size
=> 17
[14] pry(main)> Article.joins(:comments).distinct.to_sql
=> "SELECT DISTINCT \"articles\".* FROM \"articles\" INNER JOIN \"comments\" ON \"comments\".\"article_id\" = \"articles\".\"id\""
関連
-
plsql-stored-procedure ORA-06550 エラー処理
-
MHAクラスタエラーサマリーの構築
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] データベースのインデックス作成はどのように行われるのですか?[クローズド]
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] T-SQL文の接頭辞Nの意味と使うべきタイミングは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策