Rails查询值落入哪个记录的数字范围

时间:2015-04-20 23:16:48

标签: ruby-on-rails

我有一个模型,在每条记录中存储下限和上限值。这些值不重叠。

给定一个数字,如何查询记录以查看哪个记录包含该数字所属的范围?

我想我可以做类似下面的事情,但我想知道是否有更清洁,更有效的答案

@records.each do |r|
    if number.between?(r.lower_value, r.upper_value)
        desired_record = r.id
        break
    end 
end 

感谢您的光临。

2 个答案:

答案 0 :(得分:1)

构建Range并使用include?测试该数字的包含。

@records.each do |r|
  if (r.lower_value..r.upper_value).include?(number)
    desired_record = r.id
    break
  end 
end 

如果您想获得数字在范围内的所有记录:

@records.select {|r| (r.lower_value..r.upper_value).include?(number)}

如果您只想要第一条记录:

@records.detect {|r| (r.lower_value..r.upper_value).include?(number)}

如果您只想从数据库中提取匹配的记录:

Model.where("lower_value <= ? AND upper_value >= ?", number, number)

答案 1 :(得分:1)

如果你的数据库支持使用between怎么样?

Record.find_by_sql("SELECT * from records where ? BETWEEN lower_value and upper_value", number)

让数据库完成工作。

postgresql中的示例:

foo_development=# select * from records;
 id | lower_value | upper_value
----+-------------+-------------
  1 |           1 |          10
  2 |          11 |          15
  3 |          16 |         120
(3 rows)


 select * from records where 100 between lower_value and upper_value;
 id | lower_value | upper_value
----+-------------+-------------
  3 |          16 |         120
(1 row)