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

如何解决你如何在 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) 将字符串映射为符号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?