Максимально странные результаты Ruby on Rails

#mysql #ruby-on-rails

#mysql #ruby-on-rails

Вопрос:

Я выполняю простой вызов здесь, и я не уверен, почему мои результаты настолько неустойчивы.

 Foo.maximum('bar')
  

панель выглядит следующим образом

 |bar |
|-----
|16  |
|5   |
|2   |
|10  |
|7   |
|8   |
|10  |
|9   |
  

Я ожидал бы, что вызов ответит, что максимальное значение равно 16. Единственное, что примечательно в отношении этих значений, это то, что они есть, потому что у меня нет способа узнать, будут ли они вводиться как int или float, фактически строки. Может ли это быть получение максимального значения символа, а не самих чисел?

Ответ №1:

Если вы не можете изменить базу данных и вам нужно иметь дело со строками, вы могли бы вместо этого сделать что-нибудь на ruby. Однако это может быть дорого, если в вашей Foo таблице содержится тонна материала:

 Foo.select("bar").collect{|foo| foo.bar.to_f}.max
  

Или если вы хотите избежать создания экземпляра группы объектов ActiveRecord, что приведенный выше код сделал бы даже при простом выборе одного поля:

 ActiveRecord::Base.connection.query("SELECT bar FROM foo").collect{|foo| foo.first.to_f}.max
  

Комментарии:

1. Спасибо вам обоим. К счастью, таблица никогда не будет такой огромной, и даже тогда максимум, что будет сравниваться, — это подмножество из 30 строк.

Ответ №2:

Ваше предположение полностью верно. Вычисления выполняются на основе типа столбца, в данном случае сравнения между строками.

Смотрите API для получения дополнительной информации:

http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M000297