我有一个模型,在每条记录中存储下限和上限值。这些值不重叠。
给定一个数字,如何查询记录以查看哪个记录包含该数字所属的范围?
我想我可以做类似下面的事情,但我想知道是否有更清洁,更有效的答案
@records.each do |r|
if number.between?(r.lower_value, r.upper_value)
desired_record = r.id
break
end
end
感谢您的光临。
答案 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)