0

インデックス ビューで、都市、性別、写真、年齢に基づいてユーザーをフィルターできるようにしたいと考えています。現在、年齢によるフィルタリングのみを行っています。都市と性別のオプションを選択リストに入れ、写真をチェックボックスにする必要があります。

これが私のフィルターフォームです:

<form action="/users" method="get">
Ages from: <input id="min_age" name="[min_age]" type="text" class="gteq" />
to <input id="max_age" name="[max_age]" type="text" class="gteq" />
<input class="button" type="submit" value="Filter" />
</form>

ユーザーコントローラーは次のとおりです。

def index
@users = User.all
if params[:min_age] && params[:max_age]
@users = @users.where("profiles.birthday >= ? AND profiles.birthday <= ?",
 params[:max_age].to_i.years.ago + 1.day, params[:min_age].to_i.years.ago)
end
end

City、Gender、および Photo はすべて、belongs_toUsers が使用する Profile モデルの属性です。各ユーザーhas_oneプロファイル。

すべてのフィルタリング オプションをオプションにしたい。どうすればいいですか?

4

1 に答える 1

1

レールでは、リレーションを連鎖させることができます。

def index
  @users = User.all
  if params[:min_age] && params[:max_age]
    @users = @users.where("profiles.birthday >= ? AND profiles.birthday <= ?",
    params[:max_age].to_i.years.ago + 1.day, params[:min_age].to_i.years.ago)
  end

  if params[:city]
    @users = @users.where("profiles.city = ?", params[:city])
  end

  if params[:gender]
    @users = @users.where("profiles.gender = ?", params[:gender])
  end

  ......
end

とはいえ、それは醜いです.... フィルターを書き続ける場合は、スコープをモデル化して使用するロジックをカプセル化することをお勧めします。または、 ransackという名前の優れた gem を試すことができます。ほとんどの作業が完了していることがわかります。少しカスタマイズする必要があるかどうかだけです。

于 2013-08-14T09:42:28.250 に答える