使用 Ransack 按全名搜索

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

我在继承的项目上有一个搜查表格,如下所示:

<%- 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

这适用于按名字、姓氏或电子邮件进行搜索。但是,如果我想搜索全名或名字、姓氏或电子邮件怎么办?我怎样才能做到这一点?

ruby-on-rails ransack
4个回答
7
投票

通过 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 年,但希望这对其他人有帮助。


2
投票

今天可以更轻松地完成:

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


0
投票

除了提到的建议之外,您还需要更新 ransackable_attributes。

def self.ransackable_attributes(_auth_object = nil)
 %w[fname lname phone_number full_name]
end

然后就可以使用了

ransack(full_name_or_fname_or_lname_ ...
© www.soinside.com 2019 - 2024. All rights reserved.