Rails枚举负范围(不在哪里)

时间:2016-03-17 21:18:12

标签: ruby-on-rails scope

我使用enum作为users表格中的列。我希望能够找到所有未处理的用户。这是我目前的代码:

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

User.where.not(approval_status: :pending)

但SQL查询变为:

User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE (`users`.`approval_status` != NULL)

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

如何获取所有用户,除了approval_status列的特定值外?

2 个答案:

答案 0 :(得分:3)

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

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

User.where.not(approval_status: :pending) //breaks
User.where.not(approval_status: 'pending') //returns 0 no matter what the string is.

<强>更新

上述答案实际上并不奏效。任何字符串都返回0(因此,如果您正在寻找第一个枚举,它似乎有效。)

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

User.where.not("user.approval_status = ?", User.approval_statuses[:pending])

Note-Rails 5将具有更好的枚举范围支持。

答案 1 :(得分:2)

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

您可以像这样使用它:

User.not_pending
User.not_approved
User.not_declined

相关的pull request