我觉得这应该很简单,但我的大脑短路了.如果我有一个代表当前用户的对象,并且希望查询除当前用户之外的所有用户,那么考虑到当前用户有时可能是nil岁,我该怎么做呢?

这就是我现在正在做的:

def index
  @users = User.all
  @users.delete current_user
end

我不喜欢的是,我正在对查询结果进行后处理.除了感觉有点不对劲之外,如果我将查询转换为使用will_paginate运行,我认为这不会很好地工作.对于如何通过查询实现这一点,有什么建议吗?谢谢

推荐答案

在Rails 4及更高版本中可以执行以下操作:

User.where.not(id: id)

你可以把它放在一个很好的范围内.

scope :all_except, ->(user) { where.not(id: user) }
@users = User.all_except(current_user)

如果您愿意,也可以使用类方法:

def self.all_except(user)
  where.not(id: user)
end

这两种方法都将返回AR关系对象.这意味着您可以链接方法调用:

@users = User.all_except(current_user).paginate

您可以排除任意数量的用户,因为where()也接受一个array.

@users = User.all_except([1,2,3])

例如:

@users = User.all_except(User.unverified)

甚至通过其他协会:

class Post < ActiveRecord::Base
  has_many :comments
  has_many :commenters, -> { uniq }, through: :comments
end

@commenters = @post.commenters.all_except(@post.author)

API Docs页中的where.not()页.

Ruby-on-rails相关问答推荐

使用RubyZip处理大型压缩文件:65535个文件的限制

如何在不触发每次编译的情况下运行`bin/rails测试`?

从 rails 5 迁移到 rails 6

如何获取 Rails 表单构建器将为某个字段生成的 HTML名称属性?

使用带有 bootstrap-sass gem 的 Rails 4 无法让 CSS 在 Heroku 上工作

Rails 模型.有效吗?刷新自定义错误并错误地返回 true

升级到设计 3.1 => 获取重置密码令牌无效

带有 master.key 的 Rails 5.2 - Heroku 部署

Rails:从视图内渲染视图(不是部分视图)

设计记住我和会话

在rails中带有内部文本或html的link_to image_tag

您将 Rack 中间件文件和要求放在哪里?

Rails SQL 正则表达式

将 Rails 服务器绑定到 0.0.0.0 能给你带来什么?

rails respond_to format.js API

Rails: Sprockets::Rails::Helper::AssetNotPrecompiled 在开发中

find、where 和 find_by_id 有什么区别?

Ruby 中有与 slice 函数相反的函数吗?

未捕获的 ReferenceError:未定义 ReactDOM

为什么 Rails 需要 JavaScript 运行时?