2015-04-20 2 views
0

У меня есть модель, которая хранит нижнее и верхнее предельное значение в каждой записи. Значения не перекрываются.Rails-запрос, номер диапазона которого имеет значение

Учитывая число, как я могу запросить записи, чтобы увидеть, какая запись содержит диапазон, в который входит число?

Я думаю, что я мог бы сделать что-то вроде ниже, но мне интересно, есть уборщик и более эффективный ответ

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

Спасибо для смотреть.

+0

Вы можете написать Arel или SQL в ваших ActiveRecord искатели. Что-то вроде @ records.each {| record | record.where ('lower_value IS? AND upper_value IS?', number, number) .first} – JamesDullaghan

ответ

1

Построить a 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) 
+0

Спасибо. Последнее заявление, которое вы дали, - это то, что я ищу. На самом деле должен был это знать сам. –

+0

Hi infused, я столкнулся с другой проблемой при поиске диапазона. Есть ли способ сохранить значение для бесконечности, поскольку одна из записей не имеет верхнего значения (потому что это бесконечность). Я работаю в течение нескольких часов, но не знаю, как включить случай, когда одна запись не имеет верхнего значения в моем запросе выше. –

+1

Я только что обновил свой ответ, как обрабатывать этот случай. – infused

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) 
+0

Thanks Doon. Очень признателен –

Смежные вопросы