我正试图编写一个查询,查找客户的全名。
我有一个名为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

但是如果列中的任何一个有空值,||将返回空值,以避免您必须编写||

07-26 08:09