簡體   English   中英

rails“ where”語句:我如何忽略空白參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM