0

我有一个Project模型User加入了一个Membership模型。我想检索一个项目的成员,除了一个用户。

project.members.where.not(id: current_user)

像这个答案一样,我想使用一个范围:

class User < ActiveRecord::Base
  scope :except, ->(user) { where.not(id: user) }
end

但这不起作用。

p.members.except(User.find(1))
User Load (1.0ms)
  SELECT "users".* FROM "users"
  WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]

User Load (0.4ms)
  SELECT "users".* FROM "users"
  INNER JOIN "memberships" ON "users"."id" = "memberships"."user_id"
  WHERE "memberships"."project_id" = $1  [["project_id", 2]]

如您所见,这会导致两个查询,而不是一个。并返回所有成员,不考虑排除。

为什么这不起作用?

4

1 回答 1

1

尝试将范围重命名为其他名称,例如except_forall_except。名称 except 已被 active_record 使用

http://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-except

您还会收到 2 个查询,因为您正在执行 User.find(1) ,这会导致第一个查询。

于 2014-05-16T17:28:49.263 回答