我正在尝试编写一个查询客户端的全名。
我有一个名为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%')
感谢您的帮助。
答案 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