为什么你的代码不起作用?
Project.where(:is_available?)
在 where 方法中,您必须传递参数散列或 (SQL) 条件字符串。您在这里尝试做的是选择方法 is_available 的所有项目?返回真。问题是该方法is_available?
是一个 Ruby 方法(在您的模型中定义)。由于它是一个 Ruby 函数,因此不能在 SQL 内部调用它。where 方法需要 SQL 条件,而不是 ruby 代码。
(感谢@benzado 的评论)
要解决您的问题:
这就是您要查找的内容,仅在 db 级别计算:
Project.joins(:workers)
.select('projects.*')
.group('projects.id')
.having('COUNT(workers.*) > 2')
这应该返回至少有 2 名工作人员关联的所有项目。
如何改善这一点?
您可以设置此查询的范围,以便在任何地方轻松使用它:
#in your model
class Project < ActiveRecord::Base
scope :having_more_than_x_workers, lambda do |workers_count|
joins(:workers).select('projects.*').group('projects.id').having("COUNT(workers.*) > #{workers_count || 0}")
end
end
要使用它,例如在您的控制器中:
#in your controller
def index
@projects = Project.having_more_than_x_workers(2)
end