1

私はRailsにかなり慣れていないので、これに間違った角度からアプローチしていると感じていますが、ここにあります...車両を表示するリストページがあり、ユーザーが結果をフィルタリングできるフィルター機能を追加しようとしていますvehicle_size、メーカー、および/または payment_options ごと。

3 つの選択フォーム フィールドを使用して、ユーザーは :vehicle_size、:manufacturer、および/または :payment_options パラメーターの値を設定し、これらの値を使用しているコントローラーに送信できます。

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

一種のクエリ。これは個々のパラメーターに対して正常に機能します (上記は正しい車両サイズの結果を返します) が、パラメーターの 1 つが空白のままになっている場合、結果を取得せずに 3 つのパラメーターすべてを渡すことができるようにしたいと考えています..

どのパラメーターが設定されているかに応じて異なる where ステートメントを定義する if ステートメントを作成するプロセスを経ずにこれを行う方法はありますか? フィルター オプションを追加すると、これは非常に面倒になる可能性があります。

@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 )
4

2 に答える 2

8

できるよ:

@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])

残りのパラメーターをそれぞれ使用して同じことを行うことができます。

于 2013-08-12T10:51:24.737 に答える
0

has_scope gemはスコープ メソッドを検索クエリに適用します。デフォルトでは、パラメーターが空の場合は無視されます。確認する価値があるかもしれません。

于 2016-03-28T20:07:30.427 に答える