我正在关注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}%
此案似乎已解决。谢谢!我可能稍后再发布答案。
更新:哦,您想在这两列中进行搜索。一种方法是使用“ 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]'的值吗?