在Rails中执行具有否定条件的连接操作

时间:2011-02-26 09:13:33

标签: sql ruby-on-rails

我有两种模式:

class Member < ActiveRecord::Base
  has_many :member_tags
end

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

我想执行以下连接: Member.all(:joins =&gt;:member_tags,:conditions =&gt;“所有没有带有tag =”hidden“的member_tag的成员

我该怎么做?我想这更像是一个SQL问题,而不是一个轨道问题:)

2 个答案:

答案 0 :(得分:1)

我认为这可以解决问题:

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'
);

答案 1 :(得分:0)

我无法想出更好的东西,这是一个丑陋的方法,因为它为n个成员触发(n + 1)sql查询

Member.all.select {|member| !(member.member_tags.map(&:tag).include? "hidden")}