0

カテゴリ列とサイズ列を持つリスティング モデルがあります。各カテゴリには、サイズの配列があります。サイズ配列に対応する各カテゴリのリストのみを返したいです。(params[:designer]で条件としてデザイナーの配列も持っています。)

パラメータハッシュ:

params[:category] => ['tops', 'bottoms', 'outerwear', 'footwear']
params['tops'] => ['M', 'L']
params['bottoms'] => []
params['outerwear'] => ['XL']
params['footwear'] => ['11', '12']

これを行うためのループを作成しました:

@listings = []
params[:category].each do |category|
  @listings += Listing.where(category: category, size: params[category], designer: params[:designer], sold: nil).includes(:photos).page(params[:category_page]).per(@perpage)
end

しかし、kaminari gem (.page 呼び出し) を使用してページ付けしているため、すべてを 1 つのクエリにする必要があります。

4

3 に答える 3

1

に配列を渡すことができますwhere

@listings = Listing.where(category: params[:category], s...
于 2013-10-24T21:35:57.773 に答える
0

これを IN クエリに変換します。

Listing.where(designer: params[:designer]).where("category IN (?)", params[:category])

アップデート:

上記のコードは op が望んでいたものではないようですので、少し変更しました。私の理解が正しければ、多くの OR を含む 1 つの大きなクエリを生成する必要があります。あなたはarelに行かなくてもそれを行うことができます:

params[:category] = ['tops', 'bottoms', 'outerwear', 'footwear']
params['tops'] = ['M', 'L']
params['bottoms'] = []
params['outerwear'] = ['XL']
params['footwear'] = ['11', '12']

query = params[:category].map do |category|
  str = "(category = ?"
  str += " AND size IN (?)" if params[category].any?
  str += ")"
  str
end

scope = Listing.where(query.join(" OR "), *params[:category].map { |cat| [cat, params[cat].any? ? params[cat] : nil] }.flatten(1).compact)
scope = scope.where(designer: params[:designer], sold: nil)
scope = scope.page(params[:per_page]).per(@page)

このクエリを生成します (ページネーションの前):

2.0.0-p247 :095 > scope.to_sql
 => "SELECT \"listings\".* FROM \"listings\"  WHERE \"listings\".\"designer\" IS NULL  AND \"listings\".\"sold\" IS NULL AND ((category = 'tops' AND size IN ('M','L')) OR (category = 'bottoms') OR (category = 'outerwear' AND size IN ('XL')) OR (category = 'footwear' AND size IN ('11','12')))"
于 2013-10-24T21:35:18.160 に答える