gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:13:39 25 4
gpt4 key购买 nike

我已将枚举 task_status 设置为:

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

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

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

但这给了我错误

ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR:operator does not exist: integer ~~ unknown) LINE 1: ...asks".* FROM"confirmed_tasks" WHERE (task_status like '%pen...^ HINT: No operator matches the given name and argument types. You might needto add explicit type casts.

有什么建议吗?

最佳答案

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

这意味着您必须确定哪些标签符合您在应用程序级别的标准。然后将它们转换成它们的整数值(在数据库中使用)。实现此目的的一种方法是使用 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)

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

关于ruby-on-rails - 你如何在 rails 中使用 LIKE 查询枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67321035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com