Ruby on rails 如何在rails中使用类似于枚举的查询?

Ruby on rails 如何在rails中使用类似于枚举的查询?,ruby-on-rails,ruby,plpgsql,pg-search,Ruby On Rails,Ruby,Plpgsql,Pg Search,我已将枚举任务_状态设置为: class ConfirmedTask < ApplicationRecord enum task_status: {pending: 1, complete: 2} end 但这给了我错误 ActiveRecord::语句无效(PG::UndefinedFunction:错误: 运算符不存在:整数~~未知)第1行:…询问“*”发件人 “已确认的任务”,其中(任务状态,如“%pen…”。。。 ^提示:没有与给定名称和参数类型匹配的运算符。您可能需要 添加

我已将枚举任务_状态设置为:

class ConfirmedTask < ApplicationRecord
  enum task_status: {pending: 1, complete: 2}
end
但这给了我错误

ActiveRecord::语句无效(PG::UndefinedFunction:错误: 运算符不存在:整数~~未知)第1行:…询问“*”发件人 “已确认的任务”,其中(任务状态,如“%pen…”。。。 ^提示:没有与给定名称和参数类型匹配的运算符。您可能需要 添加显式类型转换


有什么建议吗?

如果您想在此处使用枚举,则需要将枚举值作为字符串存储在数据库中。当前您的列
任务\u状态
具有
整型
类型。因此,您无法使用LIKE运算符进行搜索。若要解决此问题,请进行此更改

  enum task_status: {pending: 'pending', complete: 'complete'}
并将
task_status
列的类型设置为数据库中的
string

但我建议您尽可能从前端发送值的全名。

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

这意味着您必须找出哪些标签符合应用程序级别的条件。然后将它们转换为整数值(在数据库中使用)。实现这一点的一种方法是与符合您的要求的标签结合使用

# 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字符串参数)来完成


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

看起来枚举不适合您的用例。我建议删除枚举并存储实际字符串值(待定,完成)或者,如果使用枚举,请让UI提供完整值(“挂起”而不是“挂起”)
# 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)
# 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)