2012-12-31 111 views
2

我正在使用rails cast視頻http://railscasts.com/episodes/240-search-sort-paginate-with-ajax。 我必須使用兩個條件來搜索我的數據庫。在Ruby on Rails的MongoDB中搜索兩個條件

# In my form for search 
<%= form_tag products_path, :method => 'get', :id => "products_search" do %> 
    <p> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", :name => nil%> 
    </p> 

對於一個條件,這工作得很好:

# In my model product.rb 
def self.search(search) 
    if search 
    where(name: /#{Regexp.escape(search)}/i) 
    else 
    scoped 
    end 
end 

# In my controller products_controller.rb 
@products = Product.search(params[:search]).page(params[:page]).per(5) 

現在我有其他參數來搜索,role。我在我的產品模型中有角色字段。角色是1,2,3。如果角色被給定,那麼它應該搜索具有給定輸入角色的字符串,否則僅使用名稱進行搜索。

def self.search(search,role) 
      if search 
where(name: /#{Regexp.escape(search)}/i)(and role: should be equal to value of role) 

此外,我應該在我的products_controller.rb中進行哪些更改?在我上面的搜索表單中?

+0

「角色」總是存在還是會成爲可選的搜索參數? – jbnunn

+0

在這裏如果存在,那麼它必須在默認情況下搜索角色明智的所有數據... – regmiprem

回答

2

不知道role是您的產品型號的一部分,或沒有,但如果是這樣:

def self.search(paramsname, role = nil) 
    if role 
    @products = Product.where(:name => Regexp.new(name, true), :role => role) 
    else 
    @products = Product.where(:name => Regexp.new(name, true)) 
    end 
end 
+1

您可以使用'Regexp.new(name,true)'而不是插值形式,這是一個更清潔一點。 –

+0

有用的信息克里斯 - 我更喜歡那個。回答編輯。 – jbnunn

+0

它給了我錯誤不能將零轉換爲字符串..此外,我想在我以前的模型合成像這樣,如果搜索哪裏(名稱:...)和是角色是我的模型的一部分。我在我的產品集合中有角色字段。在我的控制器中@products = Product.search(params [:search])這裏我也要添加params角色。我如何在搜索中添加角色。例如,我想找到數據的角色是1,並有字符串..... – regmiprem

2

字段添加到您的窗體:

<%= form_tag products_path, :method => 'get', :id => 'products_search' do %> 
    <p> 
    <%= text_field_tag :search, params[:search] %> 
    <%= select_tag :role, options_for_select([1, 2, 3]) %> 
    <%= submit_tag 'Search', :name => nil %> 
    </p> 
<% end %> 

使用新:role參數控制器:

@products = Product.search(params[:search], params[:role]) 
        .page(params[:page]).per(5) 

使用新的role參數在您的產品型號:

def self.search(search, role) 
    q = scoped 
    if search 
    q = q.where(:name => Regexp.new(name, true)) 
    end 

    if role 
    q = q.where(:role => role) 
    end 
    q 
end 
+0

我不知道爲什麼,但它不適合我 – regmiprem

+0

@regmiprem有一個小小的錯誤,它應該是'產品。在控制器中搜索,而不是在Product.where中搜索。它解決了嗎?如果你給出了比「不工作」更詳細的信息,那將會更容易。 –

+0

另外,我認爲它應該在模型中是'scoped'而不是'all' - all'返回一個數組,所以你不能將範圍鏈接到它。 –

2

我沒有測試它,但看着你的問題,似乎你需要更好地分開責任。考慮到這一點,您可能會更容易將這些搜索過濾器隔離在單獨的類上。

我想出了這一點:

class SearchService 
     def self.perform_search(params, klass) 
      search = klass.scoped 
      search = search.where(:name => Regexp.new(params[:name], true)) if params[:search] 
      search = search.where(:role => params[:role]) if params[:role] 
      search  
     end 
    end 

也許有些東西是不正確的,但我認爲你可以得到的想法。

所以在你的控制器,你只需要使用它作爲:

SearchService.perform_search(params, Product) 

它仍然不是很好抽象的,但我認爲這是一種更簡單,更好的方法去成的思路。

希望這會有所幫助。

+0

不能轉換爲零字符串錯誤出現。 – regmiprem

+0

你需要測試它。我只是寫了它,而沒有嘗試該代碼。就這樣你可以有想法。儘管如此,應該很容易做到這一點。檢查參數是否是預期的參數。也許你需要處理這些參數。剛剛意識到我在裏面寫了params [:name] - 也許應該是params [:search]? –