【问题标题】:Search partial full_name with Ransack where first_name and last_name are database columns使用 Ransack 搜索部分全名,其中 first_name 和 last_name 是数据库列
【发布时间】:2016-11-03 19:09:02
【问题描述】:

如果您的数据库中有两列 first_namelast_name,则 Ransack wiki 中给出的 5 个示例实际上都没有提供对全名的正确彻底搜索。

user.rb 我有:

ransacker :full_name do |parent|
  Arel::Nodes::InfixOperation.new('||',
    Arel::Nodes::InfixOperation.new('||',
      parent.table[:first_name], Arel::Nodes.build_quoted(' ')
    ),
    parent.table[:last_name]
  )
end

搜索表格如下:

= f.search_field :full_name_cont

数据库中有一个用户,其 first_name: Benjaminlast_name: Zobrist

示例 1(有效):如果您搜索 Benjamin Z,代码 sn-ps 将按预期提取记录

示例 2(不起作用):如果您搜索 Ben Zobrist,它不会提取记录。

如何让示例 2 正常工作?

【问题讨论】:

    标签: ruby-on-rails postgresql rubygems ruby-on-rails-5 ransack


    【解决方案1】:

    似乎您正在寻找对多列进行模糊匹配的全文搜索。我不确定是否有简单的解决方法。

    您可以拥有另一个(计算的)列,其值为全名,即使利用数据库的全文功能,也可以像您所描述的那样进行搜索。您还可以使用 SQL 视图并对其执行搜索。如果即使这样也没有产生结果,您可能不得不使用成熟的搜索解决方案,例如 Elasticsearch、Solr ......

    【讨论】:

    • 您能否指出使用视图进行搜索的示例的方向。我目前正在努力让这个确切的东西正常工作,并且洗劫/滑轨很痛苦。
    • 简而言之 - 您创建另一个列(例如 full_name)并创建一个 postgresql 触发器以使该列保持最新,或者您可以创建一个 before_save 操作以将 first_name + last_name 的值存储在 full_name柱子。然后,使用 ransack 查询 full_name 列,而不是分别查询名字和姓氏。
    • 是的,这就是我最终所做的。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多