按全名搜索

时间:2014-11-07 02:57:41

标签: ruby-on-rails ruby

我正在尝试编写一个查询客户端的全名。

我有一个名为Client的模型,其中包含名字,姓氏和中间名字段。

我的用户模型中也有这个client_full_name方法:

def client_full_name
"#{self.Client_fname} #{self.Client_mi} #{self.Client_lname}"
end


# FOR SEARCHES
  def self.search_by_client_full_name(query)
    where("client_full_name like ?", "%#{query}%")
  end

我在控制器中有这个

def index
#FOR SEARCHES
if params[:search]
@clients = Client.search_by_client_full_name(params[:search])
else
@clients = Client.all
end
end

我的索引中有这个

<h2>Search for Clients</h2>
<%= form_tag(clients_path, :method => "get", id: "search-form") do %>
    Search by Client Name: <br />
    <%= text_field_tag :search, params[:search], placeholder: "Search Clients" %>
    <%= submit_tag "Search", :client_full_name => nil %>
<% end %>

这是我不断获得的错误

SQLite3::SQLException: no such column: client_full_name: SELECT "clients".* FROM "clients"  WHERE (client_full_name like '%John Smith%')

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这可以解决您的问题。

Click

答案 1 :(得分:1)

您方法client_full_name是类Client的实例方法:

def client_full_name
  "#{self.Client_fname} #{self.Client_mi} #{self.Client_lname}"
end

它(client_full_name)不是您的客户表的列(至少看起来不是)。这就是你收到这个错误的原因:

SQLite3::SQLException: no such column: client_full_name: SELECT "clients".* FROM "clients"  WHERE (client_full_name like '%John Smith%')

要使查询正常工作,您需要将方法search_by_client_full_name更改为此(注意 - 以下查询仅适用于MySQL):

def self.search_by_client_full_name(query)
  where("CONCAT_WS(' ', Client_fname, Client_mi, Client_lname) LIKE :q", :q => "%#{query}%")
end

对于SQLite,您可以使用||进行连接:

def self.search_by_client_full_name(query)
  where("(Client_fname || Client_mi || Client_lname) LIKE :q", :q => "%#{query}%")
end

但是如果任何列有NULL,||将返回NULL,以避免你必须写case