Сложная фильтрация на основе отношения «многие ко многим» - PullRequest
1 голос
/ 05 августа 2010

В моей заявке Annotations считаются принятыми, если либо :

  1. Они были явно помечены как «принятые» (то есть их состояние == «принято»)
  2. Они были последний раз обновлены пользователем с ролью "редактора"

Мой вопрос - как найти все принятые объяснения с помощью одного запроса к БД. В основном я ищу управляемую базой данных версию

Annotation.all.select do |a|
  a.last_updated_by.roles.map(&:name).include?('editor') or a.state == 'accepted'
end

Моя первая попытка была

Annotation.all(:joins => {:last_updated_by => :roles}, :conditions => ['roles.name = ? or annotations.state = ?', 'editor', 'accepted'])

Но это возвращает кучу дубликатов записей (хотя добавление .uniq заставляет его работать)

Изменение :joins на :include работает, но это делает запрос слишком медленным

1 Ответ

1 голос
/ 05 августа 2010

Результаты вашей первой попытки просто неверны или им нужен только ".uniq"?Вы пробовали

:include => {:last_updated_by => [:roles]}

вместо объединения?

или делали два запроса

@ids = Editor.all(:conditions => ["role = 'editor'"], :select => ["id"]).map{|e|e.id}
Annotation.all(:conditions => ["last_updated_by in (?) or state = ?", @ids.join(","), "accepted"]

это быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...