对存储在数组中的数据进行 Ransack 搜索(运算符不存在:integer[] = integer)
Ransack search on data stored in array (operator does not exist: integer[] = integer)
我有一个 Rails 模型调用 InfoData,它有一个名为 error_codes 的属性。这些代码存储在数组中,例如 [9,7,10,21] (integer[])
.
回顾一下
InfoData.first.error_codes
=> [9,7,5]
我尝试对其进行搜查以搜索是否存在特定代码(通过 select 选项)。对于 error_codes_in (_in ransack predicate) 我收到以下错误
operator does not exist: integer[] = integer
LINE 1: ...ranch_id" WHERE "info_data"."error_codes" IN (9) A...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
应该如何修复?
我认为最简单的方法是向您的模型添加一个范围并告诉 Ransack 它可以使用该范围。你的模型中有这样的东西:
class InfoData < ApplicationRecord
def self.error_codes_has(code)
# Or use `scope` to define this class method if you prefer
# doing it that way.
where(':code = any(info_datas.error_codes)', code: code)
end
def self.ransackable_scopes(auth = nil)
%i[error_codes_has]
end
end
然后在您的搜索表单中使用该范围:
<%= search_form_for @q do |f| %>
...
<%= f.label :error_codes_has %>
<%= f.search_field :error_codes_has %>
...
<% end %>
或者,您可以 write your own ransacker 理解 PostgreSQL 数组。这可能比您需要的工作量和复杂性要多,除非您经常这样做。
我有一个 Rails 模型调用 InfoData,它有一个名为 error_codes 的属性。这些代码存储在数组中,例如 [9,7,10,21] (integer[]) .
回顾一下
InfoData.first.error_codes
=> [9,7,5]
我尝试对其进行搜查以搜索是否存在特定代码(通过 select 选项)。对于 error_codes_in (_in ransack predicate) 我收到以下错误
operator does not exist: integer[] = integer
LINE 1: ...ranch_id" WHERE "info_data"."error_codes" IN (9) A...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
应该如何修复?
我认为最简单的方法是向您的模型添加一个范围并告诉 Ransack 它可以使用该范围。你的模型中有这样的东西:
class InfoData < ApplicationRecord
def self.error_codes_has(code)
# Or use `scope` to define this class method if you prefer
# doing it that way.
where(':code = any(info_datas.error_codes)', code: code)
end
def self.ransackable_scopes(auth = nil)
%i[error_codes_has]
end
end
然后在您的搜索表单中使用该范围:
<%= search_form_for @q do |f| %>
...
<%= f.label :error_codes_has %>
<%= f.search_field :error_codes_has %>
...
<% end %>
或者,您可以 write your own ransacker 理解 PostgreSQL 数组。这可能比您需要的工作量和复杂性要多,除非您经常这样做。