2013-08-12 54 views
1

我對Rails很新穎,我有一種感覺,我從一個錯誤的角度來看待這個問題,但是這裏有...我有一個顯示車輛的列表頁面我試圖添加過濾功能,用戶可以通過vehicle_size,製造商和/或payment_options過濾結果。rails「where」聲明:我如何忽略空白參數

使用三個select表單字段,用戶可以設置的值:vehicle_size,:製造商和/或:payment_options參數和提交這些值提供給控制器,其中i正在使用

@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, :vehicle_size => params[:vehicle_size]) 

類型的查詢。這對單個參數工作正常(上面的返回結果爲正確的車輛大小),但我希望能夠通過所有3個參數而沒有得到任何結果,如果其中一個參數留空白。

是否有一個這樣做的方式沒有經過寫作過程,如果語句定義不同的地方聲明取決於什麼參數設置?如果我添加更多的過濾選項這可能成爲非常繁瑣的..也許某種直列如果對象的has_key解決的效果:

@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, if(params.has_key?(:vehicle_size):vehicle_size => params[:vehicle_size], end if(params.has_key?(:manufacturer):manufacturer => params[:manufacturer] end) 

對不起提前N00B問題和感謝。

回答

6

你可以這樣做:

@vehicles = Vehicle.order('vehicles.id ASC') 
if params[:vehicle_size].present? 
    @vehicles = @vehicles.where(vehicle_size: params[:vehicle_size]) 
end 

或者,你可以在你的模型創建範圍:

scope :vehicle_size, ->(vehicle_size) { where(vehicle_size: vehicle_size) if vehicle_size.present? } 

或者,根據this的回答,您可以創建類方法:

def self.vehicle_size(vehicle_size) 
    if vehicle_size.present? 
    where(vehicle_size: vehicle_size) 
    else 
    scoped # `all` if you use Rails 4 
    end 
end 

您可以在控制器中調用範圍和類別方法,例如:

@vehicles = Vehicle.order('vehicles.id ASC').vehicle_size(params[:vehicle_size]) 

您可以分別對其餘參數做同樣的事情。

+0

啊 - 讓你設置@vehicles,然後你把它通過WHERE語句爲每過濾器是存在的嗎?..我想象在一條線上完成所有工作,但是這個工作正常 - 感謝很多 –

+0

好的解決方案歡呼隊友。 :) – ndrx42

0

has_scope gem適用範圍的方法來搜索查詢,默認情況下它忽略了當參數都是空的,它可能是值得檢查