Rails 3:选择子模型具有特定条件的所有子模型

时间:2011-03-01 13:51:59

标签: ruby-on-rails-3 activerecord arel

我的Rails数据库方案有项目和任务。我想展示至少有一个开放任务的项目。这是我的代码:

class Project
    scope :open_tasks, lambda {
        where(:tasks => {:finished => false}).includes(:tasks)
    }
    ...
end

此代码正确地返回具有一个打开任务的项目,但只返回一个打开的任务,而不是全部。例如一个项目共有5个任务和2个开放任务,上面的代码只返回带有2个任务的项目。我知道我可以简单地强制重新加载项目,但这非常hackish并且存在性能问题。 如何让项目完成所有任务?

1 个答案:

答案 0 :(得分:1)

where条件总是会限制返回哪些相关任务。

如果至少其中一项任务没有完成,听起来你想要返回项目和所有相关任务而不管状态

你可以尝试这个(我不认为你需要lambda,因为你没有在你的范围内使用任何变量/时间等)。它假设您有has_many :tasksbelongs_to :project。如果你使用的是has_many:through等,你需要调整它。

scope :open_tasks, where("(select count(*) from tasks where tasks.project_id=projects.id) > 0").includes(:tasks)