Rails枚举的否定范围(如果没有)

Mir*_*318 2 scope ruby-on-rails

enumusers表中使用一列。我希望能够找到所有未挂起的用户。这是我当前的代码:

enum approval_status: [:pending, :approved, :declined]

User.where.not(approval_status: :pending)
Run Code Online (Sandbox Code Playgroud)

但是,SQL查询变为:

User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE (`users`.`approval_status` != NULL)
Run Code Online (Sandbox Code Playgroud)

无论我输入什么枚举值,SQL都将其转换为 NULL

我如何获得所有用户,但不包括approval_status列的特定值?

dem*_*mir 9

在Rails 6中,将负范围添加到枚举值上。

您可以像这样使用它:

User.not_pending
User.not_approved
User.not_declined
Run Code Online (Sandbox Code Playgroud)

相关拉取要求


Mir*_*318 6

在这种情况下,Rails 无法处理符号。然而,字符串工作正常字符串也被破坏,但以不同的方式:

\n\n
enum approval_status: [:pending, :approved, :declined]\n\nUser.where.not(approval_status: :pending) //breaks\nUser.where.not(approval_status: \'pending\') //returns 0 no matter what the string is.\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

上面的答案实际上不起作用。任何字符串都会返回0(所以如果您正在寻找第一个枚举,它似乎可以工作)。

\n\n

以下内容将实际使用您的枚举:

\n\n
User.where.not("user.approval_status = ?", User.approval_statuses[:pending])\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意\xe2\x80\x94Rails 5 将有更好的枚举范围支持。

\n