【问题标题】:Rails: multiple params (filter) with has_scopeRails:使用 has_scope 的多个参数(过滤器)
【发布时间】:2012-12-12 20:37:32
【问题描述】:

我正在使用 has_scope gem,我想使用两个参数创建过滤 - 它可能是一个参数或两个同时。

我的模型(产品):

scope :brand, proc { |brand| joins(:product_values).where('product_values.value_id' => brand) }
scope :zamena, proc { |zamena| joins(:product_values).where('product_values.value_id' => zamena) }

控制器的索引动作:

 @products = apply_scopes(Product).all

它有效,但只有一个:(

/products?brand=12 - Ok
/products?zamena=24 - Ok
/products?brand=12&zamena=24 - Fail (sorted only by 'zamena', not by both params)

第二。变体(也不起作用) 在我的控制器中:

query = Product.scoped
query = query.brand(params[:brand]) if params[:brand]
query = query.zamena(params[:zamena]) if params[:zamena]
@products = query.all

一个有效,但不能同时有效(0 个结果)。

【问题讨论】:

  • 您的预期行为是什么?您的两个范围完全相同。您要求product_values.value_id == 12product_values.value_id == 24 的所有产品。你不能指望同一个属性有两个不同的值。
  • 没错。我想同时获得 value_id == 12 和 value_id == 24 的产品(产品 has_many 值通过 product_values)。谢谢。我了解问题,但尚未解决:)
  • Rogier,谢谢,但对我没有用。也许“作用域”方法与 3.1 rails 版本或其他版本不同。

标签: ruby-on-rails scope has-scope


【解决方案1】:

我的回答。也许不优雅,但效果很好。

  fcount = 0
  fcount += 1 if params[:brand]
  fcount += 1 if params[:zamena]

  prods = []
  if params[:brand]
    Product.all.each do |p|
      prods << p if p.product_values.where(value_id: params[:brand]).count > 0
    end
  end
  if params[:zamena]
    Product.all.each do |p|
      prods << p if p.product_values.where(value_id: params[:zamena]).count > 0
    end
  end

  @products = prods.select{|item| prods.count(item) == fcount}.uniq

不需要范围。通过这种方式,您可以使用很多过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多