[英]rails “where” statement: How do i ignore blank params
我是Rails的新手,我覺得我正從錯誤的角度來處理這個問題,但是事情就到這里了……我有一個顯示車輛的列表頁面,我正在嘗試添加過濾器功能,以便用戶可以過濾結果根據車輛尺寸,制造商和/或付款方式進行選擇。
使用三個選擇表單字段,用戶可以設置:vehicle_size,:manufacturer和/或:payment_options參數的值,並將這些值提交給我正在使用的控制器
@vehicles = Vehicle.order("vehicles.id ASC").where(:visible => true, :vehicle_size => params[:vehicle_size] )
一種查詢。 這對於單個參數來說效果很好(上面返回的是正確的車輛尺寸的結果),但是我希望能夠傳遞所有3個參數,而如果其中一個參數留空,則不會獲得任何結果。
有沒有一種方法可以完成此過程而無需編寫if語句,根據定義的參數定義不同的where語句? 如果我添加更多的過濾器選項,這可能會變得非常乏味。.如果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的問題,在此先感謝。
你可以做:
@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? }
或者,根據此答案,您可以創建類方法:
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])
您可以分別使用其余參數執行相同的操作。
has_scope gem將范圍方法應用於搜索查詢,並且默認情況下它會忽略參數為空的情況,可能值得檢查
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.