【问题标题】:Searching by full name with Ransack使用 Ransack 按全名搜索
【发布时间】:2015-07-21 22:32:41
【问题描述】:

我继承的项目有一个 Ransack 表单,如下所示:

<%- ransack_form_options ||= {} -%>
<%- search_field_options ||= {} -%>
<%- search_field_options.merge! autocomplete: "off", id: "q" -%>

<div class="search-form">
  <%= search_form_for(@q, ransack_form_options) do |f| %>
    <%= f.text_field search_on, search_field_options %>
    <%= f.submit 'Search' %>
    <%= button_tag '', class: 'cancel-search' %>
  <% end %>
</div>

search_on 的值为student_first_name_or_student_last_name_or_student_email_cont

这适用于按名字或姓氏或电子邮件进行搜索。但是,如果我想搜索 full name 或名字或姓氏或电子邮件怎么办?我该怎么做?

【问题讨论】:

标签: ruby-on-rails ransack


【解决方案1】:

用 ransack 搜索全名(名字和姓氏)

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

【讨论】:

    【解决方案2】:

    你想要的是这样的:

      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
    

    这将进入你的模型,然后在你的视图中你可以写 full_name_or_first_name_or_last_name 或任何你想写的东西。我意识到这已经晚了 3 年,但希望这对其他人有帮助。

    【讨论】:

      【解决方案3】:

      今天可以更简单了:

      ransacker :full_name do
        Arel.sql("CONCAT_WS(' ', users.first_name, users.last_name)")
      end
      

      何时有连接表:

      ransacker :user_name_with_contry_code do
        Arel.sql("CONCAT_WS(' | ', countries.code, users.first_name)")
      end
      

      https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多