1

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

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

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

4

1 回答 1

1

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

如果至少其中一项任务未完成,听起来您想退回项目及其所有相关任务,无论其状态如何?

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

scope :open_tasks, where("(select count(*) from tasks where tasks.project_id=projects.id) > 0").includes(:tasks)
于 2011-03-01T14:33:21.417 回答