Поиск записей по ассоциациям - PullRequest
0 голосов
/ 22 декабря 2011

Моя первая проблема в том, что я не уверен, может ли это вообще сработать.Но так как я уже получил большую помощь здесь, я, по крайней мере, попытаюсь что-то спросить сам.

Здесь у меня есть модельный «тезис», который имеет «много задач» через модель отношений итакже has_many 'checked_tasks'.Теперь я хочу иметь только те тезисы, в которых количество задач соответствует количеству проверенных заданий.

class Thesis < ActiveRecord::Base
  has_many :tasks, :through => :relations
  has_many :checkedtasks
end

class Task < ActiveRecord::Base
  belongs_to :relation
end

class CheckedTask < ActiveRecord::Base
  belongs_to :thesis
end

Моя первая идея состояла в том, чтобы просто обратиться к Thesis.where ( self .tasks.count == self .checked_tasks.count) - но я могуНе могу понять, что использовать вместо self , чтобы заставить его работать.

После этого я попытался сделать это с помощью областей, но это все еще оставляет меня с той же проблемой.

В конце концов, я не уверен, существует ли «рельсовый путь» ксделайте это - если так, я был бы очень благодарен за некоторую помощь

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Вы могли бы сделать

Thesis.joins(:checked_tasks, :tasks).group("thesis.id").select("thesis.*, count(distinct tasks.id) as task_count, count(distinct checked_tasks.id) as checked_count").having("checked_count = task_count")

Но это довольно сложный запрос для запуска.на самом деле кажется, что вам следует перестроить модель данных в соответствии с рекомендациями некоторых из комментаторов, используя модель соединения между тезисом и заданием, чтобы сохранить возможность проверки задания для тезиса.

1 голос
/ 22 декабря 2011

A CheckedTask - это просто задача, помеченная как выполненная? Если это так, я не знаю, зачем вам нужен отдельный класс для этого. Задача - это задача, и она либо завершена, либо не завершена. Отслеживайте это состояние в

Вы должны быть в состоянии сделать это с scope на модели Task, что-то вроде:

class Task < ActiveRecord::Base
  scope :checked, lambda { where(:complete => true) }

  ...
end

и убедитесь, что в таблице tasks есть столбец boolean с именем complete - это должно быть false, если задача еще не завершена, и true, если задача завершена.

Чтобы получить список отмеченных задач для Thesis:

@thesis = Thesis.all.fist  # <= the first Thesis in the DB
@thesis.tasks.checked      # <= a collection of Task objects that have been checked
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...