Ransack一起搜索ID和字符串

时间:2016-01-21 11:24:57

标签: ruby-on-rails ruby ransack predicates

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

  

:id_or_title_or_user_username_cont

它产生错误

  

ActionView :: Template :: Error(PG :: UndefinedFunction:ERROR:运算符不存在:integer ~~ * integer

我也试过这个

  

:id_eq_or_title_or_user_username_cont

它产生以下错误

  

未定义的方法`id_eq_or_title_or_user_username_cont'对于Ransack ::搜索

使用自定义谓词或自定义谓词之外的搜索来搜索id和字符串的合适方法是什么?

3 个答案:

答案 0 :(得分:0)

以下帖子Finding records by ID with Ransack提供了答案:


  # 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

答案 1 :(得分:0)

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

对整数列的 _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 :(得分:-1)

ransacker :id_to_s do 
  Arel.sql("regexp_replace(to_char(\"#{table_name}\".\"id\", '9999999'), ' ', '', 'g')")
end