2015-04-12 71 views
0

我編輯了我的第一個代碼,現在它更好,更清潔感謝@FunTimeFreddie,但它尚未妥善解決的問題。我會盡快回復正確的答案。通過category_id搜索項目與select_tag在軌道下拉

在搜索表單我需要過濾所有的菜單項: 1.每 類別2.每個類別和搜索「查詢」每分鐘價格& & 3. ||最大價格 ...等等,以及所有可能的組合

我已經設法使用「查詢」,min_price和max_price在搜索表單中搜索所有菜單項。我無法設置所選類別的結果列表,我做錯了什麼?

這是我的模型(編輯):

class Menuitem < ActiveRecord::Base 

belongs_to :menu_category 

include Filterable 

scope :newest_first, lambda { order('menuitems.created_at DESC') } 
scope :last_one, lambda { order('menuitems.created_at ASC').last } 

scope :search_keyword, lambda { |query| 
    where(["title LIKE ? or body LIKE ?", "%#{query}%", "%#{query}%"]) if query != "" 
} 

scope :menu_category_id, lambda { |menu_category_id| 
    where("menu_category_id = ?", menu_category_id) if menu_category_id != "" 
} 

scope :min_price, lambda { |price| 
    where("price > ?", price) if price != "" 
} 

scope :max_price, lambda { |price| 
    where("price < ?", price) if price != "" 
} 
end 

這是我的控制器(編輯):

class MenuitemsController < ApplicationController 
def index 
@menuitems = Menuitem.newest_first.filter(params.slice(:menu_category_id, :search_keyword, :min_price, :max_price)) 
end 

這是我的看法:

<%= simple_form_for :menuitem, :method => 'get', :url => {:action => 'index'} do |f| %> 
      <p> 
       <%= f.select :menu_category_id, options_for_select(@menucategories.map {|s| [s.title, s.id]}, params[:menu_category_id]), :selected => params[:menu_category_id], :onchange => "this.form.submit();", prompt: "Select category" %> 
      </p> 
      <p> 
      <%= f.input :search_keyword, input_html: { name: 'search_keyword', :value => params[:search_keyword]}, label: 'search recipe title', :required => false %> 
      <%= f.input :min_price, input_html: { name: 'min_price', :value => params[:min_price]}, label: 'min price:', :required => false %> 
      <%= f.input :max_price, input_html: { name: 'max_price', :value => params[:max_price]}, label: 'max price:', :required => false %> 
      <%= f.button :submit, "search" %> 
      </p> 
     <% end %> 
+0

作爲調試方法,用虛擬的文字,如[「弗雷德」,「威爾瑪」,「巴尼」的陣列替換模型在SELECT語句中, 「貝蒂」。如果這樣做的話,你的模型沒有返回一個文本數組就有問題。如果它不起作用,你的f.select被打破,需要工作,直到虛擬數組工作。像@FunTimeFreddies這樣的最新答案就是識別有用答案的方法。 –

+0

這是一個很好的建議@Matt史蒂文斯,我會嘗試一下。我已經看到該網址顯示該查詢,所以我調查它應該是在我的控制器或模型中的錯誤。關於滴答,你絕對是對的,但我不能沒有,因爲我沒有足夠的聲譽。 :(對不起 – user2092653

回答

1

可以保存你可以通過在範圍內添加一條IF語句來控制你的控制器中所有組合的所有IF語句的麻煩。例如,這也同樣適用於關聯到您的窗體的四個範圍,

# menuitem model 
scope :search_keyword, lambda { |query| 
    where(["name LIKE ?", "%#{query}%"]) if query != "" 
} 

這將允許包括只在您的控制器單行線,你的第一個IF語句下面的線,因爲這將處理空白參數。

+0

這真的很有用,非常感謝@FunTimeFreddie。但是我仍然沒有得到category_id的工作,這是在URL中的查詢: http:// localhost:3000/menuitems? UTF8 =✓&菜單項%5Bmenu_category_id%5D = 3&SEARCH_KEYWORD =第一&MIN_PRICE = 11&MAX_PRICE = 50&提交=搜索 – user2092653

0

類別參數似乎有兩個問題。首先它是params [:menuitem]中的一個嵌套參數,所以爲了訪問它,我們需要調用params [:menuitem] [:menu_category_id]。不太清楚爲什麼這是誠實的,儘管我會在這個實例中推薦使用form_tag而不是form_for,因爲我們不添加或編輯menuitems表本身。

第二個問題是類別參數作爲字符串傳遞,而我們需要它作爲整數。在應用它之前,我們需要將其轉換爲參數。

現在我不熟悉.filters方法(這是一個gem的一部分嗎?),但我只是通過將所有範圍連接在一行中,如下所示,以此來工作:

# menuitems controller 
    def index 
    @menuitems = Menuitem.newest_first.min_price(params[:min_price]).max_price(params[:max_price]).search_keyword(params[:search_keyword]).menu_category_id(params[:menuitem][:menu_category_id].to_i) 
    end 

請注意,另一種更改數據類型的方法是在範圍內執行此操作。你可以這樣做如下

# menuitem model 
scope :menu_category_id, lambda { |menu_category_id| 
where("menu_category_id = ?", menu_category_id.to_i) if menu_category_id != "" 

}