查找所有关联数大于零的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')
- 如何处理Ruby on Rails错误:“请安装postgresql适配器:`gem install activerecord-postgresql-adapter'”
- 用CodeIgniter查询MySQL,select字段为NULL的行
- delete_all vs destroy_all?
- 如何select数组中的ID Rails ActiveRecord毫无例外
- 如何findActiveRecord ROLLBACK的原因
- 使用活动loggingsearch序列化的数据
- belongs_to和has_one有什么区别?
- 你如何在Rails 3中使用ActiveRecord关联?
- Rails 4:find所有logging