你如何在 rails 中使用 LIKE 查询枚举?

问题描述

我已将 enum task_status 设置为:

class ConfirmedTask < ApplicationRecord
  enum task_status: {pending: 1,complete: 2}
end

现在我必须使用搜索参数“pend”搜索所有处于挂起状态的任务。我正在使用 pg_search 进行搜索,但它不适用于 enum,所以我想使用 LIKE 查询进行查询

ConfirmedTask.where('task_status like ?','%pend%')

但这给了我错误

ActiveRecord::StatementInvalid (PG::UndefinedFunction: 错误: 运算符不存在:整数 ~~ 未知)第 1 行:...asks".* FROM "confirmed_tasks" WHERE (task_status like '%pen ... ^ 提示:没有运算符匹配给定的名称和参数类型。你可能需要 添加显式类型转换。

有什么建议吗?

解决方法

如果你想在这里使用枚举,那么你需要将你的枚举值作为字符串存储在数据库中。目前,您的 task_status 列具有 integer 类型。因此您不能使用 LIKE 运算符进行搜索。要解决它,请进行此更改。

  enum task_status: {pending: 'pending',complete: 'complete'}

并将 task_status 列的类型设为 db 中的 string。 但如果可能的话,我建议您从前端发送值的全名。

,

枚举通常以整数形式存储在数据库中。到标签的映射是在应用程序级别完成的。数据库不知道标签。

这意味着您必须弄清楚哪些标签符合您在应用程序级别的标准。然后将它们转换为它们的整数值(在数据库中使用)。实现此目的的一种方法是将 grep 与符合您要求的 regex 结合使用。

# find the matching labels
labels = ConfirmedTask.task_statuses.keys.grep(/pend/i)
# convert them into their integer values
values = labels.map(&ConfirmedTask.task_statuses)
# create your query
ConfirmedTask.where('task_status IN (?)',values)

将标签放到值转换并让 Rails 解决这个问题会更容易一些。这可以通过将标签数组传递给普通的 where 调用(使用非 SQL 字符串参数)来完成。

# find the matching labels
labels = ConfirmedTask.task_statuses.keys.grep(/pend/i)
# pass labels to `where` and let Rails do the label -> integer conversion
ConfirmedTask.where(task_status: labels)

我不确定是否允许将字符串数组作为枚举属性的 where 条件。 The documentation uses symbols。如果上述方法不起作用,请使用 .map(&:to_sym) 将字符串映射为符号。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...