简单的搜索表单无法正常使用

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

我正在关注Railscast:http://railscasts.com/episodes/37-simple-search-form?autoplay=true

结果在我的实现中显示得很好。但是因为我有first_name和last_name列,而不是上面的示例中的“ name”列,所以无论搜索词是什么,我都需要一种方法来搜索两者。我怎样才能做到这一点?目前,只有名字搜索有效。

user.rb

  def self.search(search)
    if search
      where('first_name LIKE :search OR last_name LIKE :search', search: "%#{search}%")
    else
      all
    end
  end

people_controller,索引功能:

@users = User.search(params[:search])

index.html.erb(用于人员控制):

    <%= form_tag people_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag("Search users", first_name: nil, last_name: nil) %>
  </p>
    <% end %>

  <ul>
  <% @users.each do |user| %>
    <li>
      <%= link_to profiles_path(user_id: user.id) do %>
        <%= user.first_name %> 
        <%= user.last_name %>
      <% end %>
    </li>
  <% end %>
  </ul>

更新:

所以这很奇怪。我有4个用户。对于前3个,只有名字搜索有效。姓氏或全名(或部分名称)没有。对于姓氏用户,仅姓氏搜索有效。

...可能会发生什么?刚让三个用户进行了测试。仅按名字搜索第一个新用户。第二个新用户仅按姓氏搜索。他的名字是第3个用户的姓氏的一部分,当用该新用户的名字搜索时返回了第3个原始用户名(...为什么?以前不像这样;部分名称搜索不起作用对于其他用户)。并且仅搜索第三用户的姓氏。

更新:

好,什么也没做。但是,现在可以通过姓氏或名字(仅姓氏之前)搜索第一个原著的用户。为什么?第二原始用户也是如此。现在可以部分搜索两个用户。为什么?并且姓氏(仅可搜索)的最后一个新用户现在无法被任何人搜索。为什么?

并再次尝试过并返回到以前的状态,只能通过名字搜索,没有部分搜索,等等。为什么这会不断变化?如何使搜索词简单地搜索名字或姓氏或两者都搜索?

更新:

我得到了答案(以上所述,不是一般情况)。搜索是区分大小写的。现在,我的问题是:如何使它不区分大小写,并使包含名字和姓氏(例如“ Tom Paulson”)的搜索词有效? (目前仅搜索其中一种作品)

更新:

所以我通过将LIKE更改为ILIKE解决了区分大小写的问题。我正在使用Postgres。

如果您可以同时搜索名字和姓氏,我将不胜感激!

更新:

所以我现在正在用它来搜索名字和姓氏或两者。但是现在部分搜索不起作用。有没有办法在这里进行这项工作?

      where("first_name ilike :search or last_name ilike :search or first_name || ' ' || last_name ilike :search", search: "%#{search}")

更新:

通过在%#{search}中添加%来解决%#{search}%

此案似乎已解决。谢谢!我可能稍后再发布答案。

ruby-on-rails ruby erb
1个回答
0
投票

更新:哦,您想在这两列中进行搜索。一种方法是使用“ concat”。假设您在名字和姓氏之间放置一个空格:

where("CONCAT(first_name, ' ', last_name ) ILIKE ?","%#{search}%")

第一个答案:

def self.search(search)
    if search
      buff=search.downcase
      where('lower(first_name) LIKE ? OR lower(last_name) LIKE ?', "%#{buff}%", "%#{buff}%")

应该工作。

或如果愿意,可以选择ILIKE。

where('first_name ILIKE ? OR last_name ILIKE ?', "%#{search}%", "%#{search}%")

如果不是nil,您可以检查'params [:search]'的值吗?

© www.soinside.com 2019 - 2024. All rights reserved.