2014-11-07 113 views
2

我正在尝试编写一个查询来查找客户的全名。按全名搜索

我有一个名为客户端的名字,姓氏和中间名字段。

我也有这个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

给出更多代码。和你当前的代码是错误的。你有一个方法名称,而不是在where子句中命名的属性。 – 2014-11-07 02:59:19

+0

但我怎么去寻找在名字和姓氏字段? – Liliana 2014-11-07 03:11:37

+0

'query'是否总是包含名字,姓氏和名字? – Santhosh 2014-11-07 05:18:40

回答

1

你方法client_full_nameClient类的实例方法:

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,以避免你必须为w rite case

+0

非常感谢您的帮助!你其实花了时间向我解释。我很感激。 – Liliana 2014-11-08 18:15:51

+0

还有一个问题,我会在我的索引页上放什么?而不是<%= submit_tag“搜索”,::client_full_name => nil%> – Liliana 2014-11-08 18:48:36

+0

可以只是'<%= submit_tag“搜索”%>'不需要':client_full_name => nil' – Surya 2014-11-08 18:50:35

3

这可以解决您的问题。

patient_first_name_cont = "Ajay" 
patient_last_name_cont = "Kumar" 
shared_context = Ransack::Context.for(Request) 

search_parents = Request.includes(:request_status).ransack(
    { patient_first_name_cont: patient_first_name_cont }, context: shared_context 
) 

search_children = Request.includes(:request_status).ransack(
    { patient_last_name_cont: patient_last_name_cont }, context: shared_context 
) 

    shared_conditions = [search_parents, search_children].map { |search| Ransack::Visitor.new.accept(search.base)} 

    @req = Request.joins(shared_context.join_sources).where(shared_conditions.reduce(&:and))