2013-11-25 16 views
46

私はそれが単純だと思ったが、それはそうではないと思われる何かをしようとしている。0より大きい関連付けのカウントを持つすべてのレコードを見つける

私には空きが多いプロジェクトモデルがあります。

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)を言います。

答えて

29

joinsは、内側にはこれだけ関連した欠員を持ってプロジェクトを返す効果でProject.joins(:vacancies)意志を使用して、デフォルトで結合を使用します。

UPDATE:

としてgroup句を使用せずに、上記のコードは、複数の欠陥でのプロジェクトの重複事業を返します、コメントで@mackskatzによって指摘。重複を削除するには、

Project.joins(:vacancies).group('projects.id') 
+0

しかし、group by節を適用しないと、複数の空きがあるプロジェクトの複数のProjectオブジェクトが返されます。 – mackshkatz

19

ええと、vacanciesは、結合のフィールドではありません。私はあなたがしたいと考えている:

Project.joins(:vacancies).group("projects.id").having("count(vacancies.id)>0") 
+0

どこでしたか:休暇はどこから来たのですか? –

-4

を入力してください。このエラーは、基本的に空きがプロジェクトの列ではないことを示しています。

Project.joins(:vacancies).group('projects.id').having('count(project_id) > 1') 

:1人のを超える欠員でのプロジェクトを取得するには

Project.joins(:vacancies).group('projects.id') 

2):これは、少なくとも1欠員でのプロジェクトを取得するには

Project.joins(:vacancies).where('COUNT(vacancies.project_id) > 0') 
+4

'集計関数はWHEREでは許可されていません。 ' – squixy

87

1)動作するはず

3)または、Vacancyモデルでカウンタキャッシュを設定する場合:

belongs_to :project, counter_cache: true 

が、これはあまりにも、動作します:vacancyため

Project.where('vacancies_count > ?', 1) 

変曲ルールはspecified manuallyをする必要があるかもしれませんか?多くのRailsのなし

2
# None 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 0') 
# Any 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 0') 
# One 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 1') 
# More than 1 
Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 1') 
0

魔法、あなたが行うことができます:

Project.where('(SELECT COUNT(*) FROM vacancies WHERE vacancies.project_id = projects.id) > 0') 

の作業の多くは、DB側で直接行われているような条件のこのタイプは、すべてのRailsのバージョンで動作します。さらに、チェーン.countメソッドもうまく動作します。私は前にProject.joins(:vacancies)のようなクエリで焼かれました。もちろん、DBにとらわれないので、長所と短所があります。

+0

' select count(*).. 'サブクエリがプロジェクトごとに実行されるので、これはjoinおよびgroupメソッドよりもはるかに低速です。 – YasirAzgar

関連する問題