查找所有关联数大于零的logging

我正在尝试做一些我认为很简单的事情,但似乎没有。

我有一个有很多空缺的项目模型。

class Project < ActiveRecord::Base has_many :vacancies, :dependent => :destroy end 

我想要得到所有至less有一个空缺的项目。 我尝试了这样的事情:

 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)实际上只会返回具有相关空缺的项目。

更新:

正如@mackskatz在评论中所指出的那样,如果没有一个group子句,上面的代码将为有多个空缺的项目返回重复的项目。 要删除重复项,请使用

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

1)获得至less1个空缺的项目:

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

2)获得超过1个空缺的项目:

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

3)或者,如果Vacancy模式设置计数器caching:

 belongs_to :project, counter_cache: true 

那么这也将工作:

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

vacancy规则可能需要手动指定 ?

是的, vacancies不是join领域。 我相信你想要:

 Project.joins(:vacancies).group("projects.id").having("count(vacancies.id)>0") 
 # 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') 

错误是告诉你,基本上,空缺不是项目的专栏。

这应该工作

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