2014-11-07 6 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'. –

+0

, но как бы я искал поиск как в имени, так и в имени? – Liliana

+0

Будет ли 'query' всегда содержать первое, последнее и среднее имя? – Santhosh

ответ

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 к этому (Примечание- Query ниже будет работать только для 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, чтобы избежать этого, вы должны будете ш rite case

+0

Большое спасибо за вашу помощь !! Вы действительно потратили время, чтобы объяснить мне. Я ценю это. – Liliana

+0

Еще один вопрос, что бы я наложил на свою индексную страницу? вместо <% = submit_tag «Поиск»,: client_full_name => nil%> – Liliana

+0

Это может быть просто '<% = submit_tag" Поиск "%>' no need of ': client_full_name => nil' – Surya

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)) 
Смежные вопросы