【问题标题】:Simple search form is not working in rails简单的搜索表单在 Rails 中不起作用
【发布时间】:2020-01-10 01:23:06
【问题描述】:

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

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

用户.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 个,只有名字搜索有效。姓氏或全名(或部分名称)没有。对于最后一个用户,只有姓氏搜索有效。

...会发生什么?刚刚又增加了三个用户并进行了测试。第一个新用户仅按名字进行搜索。第二个新用户仅按姓氏进行搜索。他的名字是第三个用户的姓氏的一部分,当用新用户的名字搜索时返回了第三个原始用户名(...为什么?以前没有这样工作;部分名称搜索不起作用其他用户)。并且只搜索了第三个用户的姓氏。

更新:

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

刚才又试了一次,又回到了以前,只能按名字搜索,不能部分搜索,等等。为什么这一直在变化?我怎样才能让搜索词只搜索名字或姓氏或两者兼而有之?

更新:

我得到了答案(以上,不是一般的)。搜索区分大小写。现在我的问题是:我怎样才能使它不区分大小写并让包含名字和姓氏的搜索词(例如“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】:

    更新:
    哦,你想在两列中搜索。 一种方法是使用“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}%")
    

    如果'params[:search]'不为零,你能检查它的值吗?

    【讨论】:

    • 谢谢。所以名字搜索效果很好。但姓氏不会被搜索。我的偏好是任何搜索词都搜索其中一个/两个。已编辑为最新版本。
    • 我明白了。你快到了。我已经更新了我的答案。
    • 谢谢。我在刷新页面时得到了这个:wrong number of arguments (given 0, expected 1)
    • 再次感谢您。试了ILIKE版本,同样报错:wrong number of arguments (given 0, expected 1)
    • 对不起,我错过了语法。你能试试这个吗?