#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