Выполнение операции соединения с отрицательным условием в Rails - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть две модели:

class Member < ActiveRecord::Base
  has_many :member_tags
end

и

class MemberTag < ActiveRecord::Base
   belongs_to :member
  # has a column 'tag'
end

Я хочу выполнить следующее соединение: Member.all (: joins =>: member_tags,: условие =>" все участники, у которых нет member_tag с тегом =" hidden ")

Как мне это сделать? Я думаю, это больше вопрос SQL, чем вопрос rails :)

Ответы [ 2 ]

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

Я думаю, что это может сработать:

select  `members`.*
from `members`
LEFT JOIN `member_tags`
ON `members`.id = `member_tags`.member_id
where `members`.id NOT IN (select  `members`.id
from `members`
LEFT JOIN `member_tags`
ON `members`.id = `member_tags`.member_id
where `member_tags`.tag = 'hidden'
);
0 голосов
/ 26 февраля 2011

Я не могу придумать что-то лучше, и это ужасный способ сделать это, поскольку он запускает (n + 1) SQL-запросов для n членов

Member.all.select {|member| !(member.member_tags.map(&:tag).include? "hidden")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...