Sql 在Rails中使用负条件执行联接操作

Sql 在Rails中使用负条件执行联接操作,sql,ruby-on-rails,Sql,Ruby On Rails,我有两种型号: class Member < ActiveRecord::Base has_many :member_tags end 类成员“所有没有带有tag=“hidden”的Member\u标记的成员) 如何做到这一点?我想这更像是一个SQL问题,而不是rails问题:)我想不出更好的方法,这是一种丑陋的方法,因为它会为n个成员触发(n+1)SQL查询 Member.all.select {|member| !(member.member_tags.map(&:tag

我有两种型号:

class Member < ActiveRecord::Base
  has_many :member_tags
end
类成员

class MemberTag
我要执行以下连接: Member.all(:joins=>:Member\u tags,:conditions=>“所有没有带有tag=“hidden”的Member\u标记的成员)


如何做到这一点?我想这更像是一个SQL问题,而不是rails问题:)

我想不出更好的方法,这是一种丑陋的方法,因为它会为n个成员触发(n+1)SQL查询

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

我认为这可以做到:

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

虽然答案在SQL中很简单(左键连接并检查null,或者在
子查询中编写一个
NOT),但我不知道如何用ActiveRecord语法为您表达它。您能帮我一下吗?我的SQL技能很糟糕。这似乎返回了所有具有未“隐藏”标记的成员“。相反,我希望所有没有此标记的成员。@mike..我已经编辑了答案,但我不推荐它。
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'
);