我正试图编写一个查询,查找客户的全名。
我有一个名为client的模型,其中包含first name、last name和middle name字段。
我的用户模型中也有这个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%')
谢谢你的帮助。
最佳答案
you methodclient_full_name
是类的实例方法:
def client_full_name
"#{self.Client_fname} #{self.Client_mi} #{self.Client_lname}"
end
它(
Client
)不是clients表的列(至少看起来不是)。这就是为什么你会犯这个错误:SQLite3::SQLException: no such column: client_full_name: SELECT "clients".* FROM "clients" WHERE (client_full_name like '%John Smith%')
要使查询工作,您需要将方法
client_full_name
更改为this(注意-下面的查询仅适用于mysql):def self.search_by_client_full_name(query)
where("CONCAT_WS(' ', Client_fname, Client_mi, Client_lname) LIKE :q", :q => "%#{query}%")
end
对于sqlite,可以使用
search_by_client_full_name
进行连接:def self.search_by_client_full_name(query)
where("(Client_fname || Client_mi || Client_lname) LIKE :q", :q => "%#{query}%")
end
但是如果列中的任何一个有空值,
||
将返回空值,以避免您必须编写||