如何通过has_many关系的属性之和来过滤模型

时间:2015-03-19 15:02:59

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我有一个名为Promoter的模型和一个名为PromoterProject的模型。每个启动子都有许多启动子项目:

class Promoter < ActiveRecord::Base
  has_many :promoter_projects
end

class PromoterProject < ActiveRecord::Base
  belongs_to :promoter
end

PromoterProject模型具有整数类型的列work_days。它代表了发起人为项目工作的天数。

我需要实现一个过滤器,在指定值之间返回具有总工作日(在所有项目中)的启动器。我在使用活动记录查询方法构建查询时遇到困难。到目前为止,我有以下内容:

Promoter.includes(:promoter_projects).group('promoters.id').select('promoters.*, sum(promoter_projects.work_days) as total_days').where('total_days between ? and ?', min_value, max_value)

我收到错误消息,指出无法找到 total_days

我在实习生中发现的大部分内容(组和选择语句)已经缝合了,所以我并不完全了解到底发生了什么。如果您能为我提供其他解释,我将非常感激!

其他信息:

Rails版本4.1.4 PostgreSQL的

1 个答案:

答案 0 :(得分:2)

正如阿尔宾所说,使用连接。但是,使用聚合函数时,最简单的方法是使用having

Promoter.joins(:promoter_projects)
.having('SUM("promoter_projects"."work_days") BETWEEN ? AND ?', min_value, max_value)
.group("promoters.id")