我的网址中有以下参数。
考虑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 )
答案 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中的讨论。