如何解决你如何在 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 举报,一经查实,本站将立刻删除。