一起搜查搜索 ID 和字符串

问题描述 投票:0回答:5

我正在尝试使用 Ransack 进行搜索,但当我尝试搜索 id 和字符串时遇到问题

:id_or_title_or_user_username_cont

它产生错误

ActionView::Template::Error (PG::UndefinedFunction: ERROR: 操作符不存在: 整数 ~~* 整数

我也试过这个

:id_eq_or_title_or_user_username_cont

它产生以下错误

Ransack::Search 的未定义方法“id_eq_or_title_or_user_username_cont”

除了自定义谓词之外,使用 ransack 或使用自定义谓词一起搜索 id 和字符串的正确方法是什么?

ruby-on-rails ruby ransack predicates
5个回答
3
投票

我需要比其他答案提供的更多细节,所以就在这里。

对整数列进行

_cont
搜索不起作用,因为 LIKE 查询不适用于此类列。您需要将列从整数转换为字符串才能使查询正常工作。在您的模型中,您可以通过
ransacker
调用来做到这一点:

# app/models/your_model.rb
class YourModel

  # For Postgres
  ransacker :id do
    Arel.sql("to_char(\"#{table_name}\".\"id\", '99999999')")
  end

  # For MySQL
  ransacker :id do
    Arel.sql("CONVERT(`#{table_name}`.`id`, CHAR(8))")
  end

然后您可以使用像

id_cont
这样的搜索谓词。


2
投票

以下帖子使用 Ransack 按 ID 查找记录提供了答案:


  # Cast the ID column to a string in PostgreSQL
  # when searching with Ransack.
  # Allows searches with _cont and _eq predicates.
  # From https://github.com/ernie/ransack/issues/224
  ransacker :id do
    Arel.sql("to_char(\"#{table_name}\".\"id\", '99999999')")
  end

提供的答案最初来自这个github问题:https://github.com/activerecord-hackery/ransack/issues/224


0
投票

小更新,因为上面的答案是正确的,但我发现它们有副作用,导致正常结果(例如完整列表,无搜索)按 ID 的字符串值排序,所以 - 1,10,11,12.. .etc...2,20,21...3,30 等而不是 1,2,3,4...

所以结合上面的两个想法,可以按ID搜索,但仍然按Int ID排序

在模型中创建用于洗劫的 ID 的字符串化版本

ransacker :id_as_str do
  Arel.sql("to_char(\"#{self.table_name}\".\"id\", '99999999')")
end

并以形式

<%= f.search_field :id_as_str_or_some_other_stuff_cont, placeholder: "Search..." %>

0
投票

如果您正在尝试使用更新的版本,那么根据 文档,您也可以将其用于 PostgreSQL:

# in the model:
ransacker :id do
  Arel.sql("to_char(id, '9999999')")
end

-2
投票
ransacker :id_to_s do 
  Arel.sql("regexp_replace(to_char(\"#{table_name}\".\"id\", '9999999'), ' ', '', 'g')")
end
© www.soinside.com 2019 - 2024. All rights reserved.