Рельсы 3: Выберите все подмодели, где подмодель имеет определенное условие - PullRequest
1 голос
/ 01 марта 2011

В моей базе данных Rails есть проекты и задачи. Я хочу показать проекты, в которых есть хотя бы одно открытое задание. Это мой код:

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

Этот код корректно возвращает проекты с одной открытой задачей, но только с одной открытой задачей, а не со всеми. например у проекта всего 5 задач и 2 открытых задачи, код сверху вернет только проект с 2 задачами. Я знаю, что я мог бы просто принудительно перезагрузить проект, но это очень хакерское и имеет проблемы с производительностью. Как мне получить проект со всеми заданиями?

1 Ответ

1 голос
/ 01 марта 2011

Условие where всегда ограничивает число возвращаемых связанных задач.

Похоже, вы хотите вернуть проекты и все связанные с ними задачи независимо от статуса , еслипо крайней мере, одна из этих задач не завершена?

Вы можете попробовать это (я не думаю, что вам нужна лямбда, поскольку вы не используете переменные / времена / и т.д. в своей области видимости).Предполагается, что у вас есть has_many :tasks и belongs_to :project.Вам нужно настроить его, если вы используете has_many: through и т. Д.

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