rails 4条件之间的多个范围

时间:2013-11-24 09:11:06

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我的网址中有以下参数。

考虑url../price=0-1000_2000-5001

我已将上述价格参数转换为

pri = [["0", "1000"], ["2000", "5001"]]  #This is not limited to only two

现在我如何在rails

中查询以下内容
select * from product where price betweeen 0 and 1000 and price between 2000 and 5001 and so on

我在rails

中找到了以下查询
Product.where(price: pri[0].first..pri[0].last)

但我怎样才能找到多个范围。

修改-1

@posts = Post.where(price:price_range)#This现在运作正常

[1001..5000,10000..0]

此处10000..0表示价格greater than 10000

但我的查询是以

执行的

从价格介于1001和5000之间或价格介于10000和0之间的帖子中选择*

但查询应该是这样的

从价格介于1001和5000之间或价格>的帖子中选择* 10000

checkbox1 = value 0-1000
checkbox2 = value 1001-5000
checkbox3 = value 5001-10000
checkbox4 = value 10001-15000
checkbox5 = value 15001-0(This indicates price > 15001 )

4 个答案:

答案 0 :(得分:0)

Product.where("(price >= ? AND price <= ?) OR (price >= ? AND price <= ?)", pri[0].first, pri[0].last, pri[1].first, pri[1].last)

这样的东西应该可行,但我没有测试这段代码。

答案 1 :(得分:0)

不是在两个范围之间使用AND,而是必须返回一些产品

Product.where("price between ? and ? or price between ? and ?", pri[0].first, pri[0].last, pri[1].first, pri[1].last)
动态阵列长度

已编辑

arr = [["0", "100"], ["100", "200"]]
query_string = ""
arr.each {|a| query_string << (arr.last == a ? " price between #{a.first} and #{a.last}"     : "price between #{a.first} and #{a.last} or") }
Product.where(query_string)

找到预期的记录。

答案 2 :(得分:0)

这是一个使用Range对象而不是手动表示范围的解决方案。和ARel而不是硬编码的SQL。通常优良的做法是使用ARel而不是SQL字符串,以便ARel可以处理您现在和将来可能使用的任何数据库适配器的SQL格式。

price_ranges = [0..1000, 2000..5001]

# Set up the base relation
products = Product.where(price: price_ranges.pop)

# iterate on any remaining prices
products = price_ranges.inject(products) do |rel, price_range|
  # Use ARel's `or` method to chain on to the relation
  rel.or(Product.arel_table[:price].in(price_range))
end if price_ranges.any?

如果需要,您可以先将价格数组转换为以下范围:

price_ranges = prices.map { |ar| Range.new(Integer(ar.first), Integer(ar.second)) }

<强>更新

如果您想继续使用范围但允许一个值大于某个数字,则可以使用Float::INFINITY来完成此操作:

price_ranges = [1001..5000, 10000..Float::INFINITY]

# For example:
Product.where(price: 10000..Float::INFINITY).to_sql
  # => SELECT "products".* FROM "products"  WHERE ("products"."id" >= 10000)

当然,这可能意味着在构建范围数组时,您需要有条件地将第二个值设置为Float::INFINITY

答案 3 :(得分:0)

有一个更简单的解决方案。这就是你所需要的:

price_ranges = [0..1000, 2000..5001]
products = Product.where(price: price_ranges)

这里的控制台输出,带有类似的查询,显示了生成的SQL:

>> ranges
=> [-Infinity..1000000, 10000000..19999999]
>> Company.where(total_funding_amount: ranges)
Company Load (0.8ms)  SELECT "companies".* FROM "companies"  WHERE ((("companies"."total_funding_amount" <= 1000000 OR "companies"."total_funding_amount" BETWEEN 10000000 AND 19999999) OR 1=0))

您甚至可以使用范围和整数的混合。如果您感到好奇,请参阅this Rails issue from 2011中的讨论。