3

我目前有这个代码:

class Group < ActiveRecord::Base
  has_many :roles

  #can't find better name for this method
  def self.without_role_ids
    find_by_sql('select id from groups where id not in
      (select distinct group_id from roles)').map { |g| g.id }
  end
end

class Role < ActiveRecord::Base
  belongs_to :group
end

without_role_ids方法输出没有任何角色的组的 ID。

我想要做的是重写这个方法:

def self.without_role_ids
  where("id NOT IN (?)", Role.pluck(:group_id))
end

它产生两个查询。

可以运行

where(id: Role.select(:group_id))

它将只产生一个 SQL 查询,但我需要的IN不是它。NOT IN

是否可以在NOT IN不使用 find_by_sql 的情况下处理一个查询?

4

1 回答 1

3

我找到了一个解决方案,用 Squeel 很容易执行这样的查询:

https://github.com/ernie/squeel

现在方法代码是:

where{id.not_in Role.select(:group_id)}

它产生这个查询:

SELECT "groups".* FROM "groups" WHERE "groups"."id" NOT IN
  (SELECT "roles"."group_id" FROM "roles" )

有关于 Squeel 的 Railscast:http: //railscasts.com/episodes/354-squeel

于 2012-11-08T08:07:45.547 回答