2012-07-20 101 views
4

我正在嘗試創建一個允許用戶搜索數據庫的應用程序。搜索頁面佈局會顯示一些下拉菜單,它們會顯示數據庫中已有數據以縮小搜索範圍,還有文本框以允許用戶輸入關鍵詞,如「項目名稱」。我遇到了一個問題,讓rails將所有已經輸入到搜索表單中的信息,並執行一個大的搜索。Ruby on Rails:搜索表單 - 多個搜索字段

這裏是我的搜索佈局的一部分:

<%= form_tag search_path, :method => 'get' do %> 

<%= hidden_field_tag :direction, params[:direction] %> 
<%= hidden_field_tag :sort, params[:sort] %> 
<p> 
<%= text_field_tag :search, params[:search] %> 
<%= submit_tag "Search Project Name", :project_name => nil %> 
</p> 
<p> 
<%= text_field_tag :search, params[:search] %> 
<%= submit_tag "Search Client", :client => nil %> 
</p> 
<% end %> 

這是我的索引和搜索的項目控制器操作:

def index 
@projects = Project.all 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @projects } 
end 
end 

def search 

@project_search = Project.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 5, :page => params[:page]) 


end 

,這裏是我的模型/ project.rb文件的一部分

def self.search(search) 
if search 
    where('project_name LIKE ?', "%#{search}%") || where('client LIKE ?', "%#{search}%") 
else 
    scoped 
end 
end 

正如您所看到的,我只是試圖在project_name或客戶端上進行搜索。如果我能做到這一點,我會將其擴展到其他領域。

當前的功能是,當我試圖在兩個框中搜索它時,它會覆蓋一個,並且只執行一次字段搜索。

我是ROR的全新品牌,所以希望有人可以提供幫助。任何建議將不勝感激。

在此先感謝!

回答

3

這個問題已經解決了另一個問題:Ruby on Rails: Advanced search

根據您的問題,@克里斯明智,那就是假設你有你的projects表兩列:project_nameclient

我可能是錯的,但我認爲你實際上有兩個模型ClientProject,其中一個客戶端有很多項目。如果是這樣,你需要定義每個模型的搜索:

客戶端模式:

def self.search search_term 
    return scoped unless search_term.present? 
    where(['client_name LIKE ?', "%#{search_term}%"]) #client_name means the column name, change it to the correct name. 
end 

項目模型:

def self.search search_term 
    return scoped unless search_term.present? 
    where(['project_name LIKE ?', "%#{search_term}%"]) #project_name means the column name, change it to the correct name. 
end 

您的形式:

<%= form_tag projects_path, method: :get do %> 
    <%= text_field_tag :project_name, params[:project_name] %> 
    <%= text_field_tag :client, params[:client] %> 
    <%= submit_tag "Search", name: nil %> 
<% end %> 

然後控制器:

#return all projects that match the search criteria 
@project_search = Project.search(params[:project_name]).all 
#return all clients that match the search criteria 
@clients_search = Client.search(params[:client]).all 

我希望它有幫助...

4

我想提出一些你可能想要做的事情。首先,除了控制器中的索引方法以外,還有一種搜索方法是不必要的,因爲它們都呈現一組項目。

所以第一關,我會改變:

<%= form_tag search_path, :method => 'get' do %> 

<%= form_tag projects_path, :method => 'get' do %> 

這將調用索引方法來代替。

我接下來會建議將搜索邏輯本身放入模型中。

在你的項目類中,添加下面的方法:

def self.search search_term 
    return scoped unless search_term.present? 
    where(['project_name LIKE ? OR client LIKE ?', "%#{search_term}%", "%#{search_term}%"]) 
end 

最後,修改你的控制器動作的指標如下:

@projects = Project.search(params[:search]).all 

有效,你在做什麼,正在尋找只有一個術語存在並以其他方式鏈接範圍。

+1

謝謝你回到我身邊。它仍然不能解決我想要兩個文本框的問題。因此,如果他們將項目名稱放在一個框中,並將客戶端名稱放在另一個框中,則應鏈接它們並在兩個字段上進行搜索,但在搜索時只有客戶端框起作用。 – Jazz 2012-07-20 12:12:34