Как прочитать результат базы данных в Ruby On Rails - PullRequest
0 голосов
/ 17 мая 2018

Я отправляю необработанный SQL в таблицу MySQL в действии RoR:

sql1 = "SELECT COUNT(*) as cnt FROM testtabl WHERE gender= 'female' AND 
ROUND(height, 2) = ROUND('#{height}' , 2);"

sql_result1 = ActiveRecord::Base.connection.execute(sql1)

logger.debug('count is: '+sql_result1.to_s)

Как мне получить доступ к значению 'cnt' из sql_result1?

Журнал показывает:

count is: #<Mysql2::Result:0xb73c6c0>

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Итак, в основном вы хотите использовать raw sql и получать результаты в хеш, чтобы быть доступными.Попробуйте приведенный ниже код, где MODEL - имя класса модели.Например, имя класса для таблицы пользователей может быть User.

Model.connection.select_all(sql).to_hash

Однако вы могли бы использовать ActiveRecord where с помощью встроенного метода round.

0 голосов
/ 17 мая 2018

Ответ на вопрос OP заключается в том, что MySQL :: Result ведет себя как перечисление, поэтому вы можете преобразовать его в массив строк, а затем проиндексировать значение первой строки:

sql_result1.to_a[0][0]

Однако решение проблемы ОП состоит в том, чтобы просто позволить ActiveRecord сделать свое дело:

Model.where(gender: 'female').where('ROUND(height, 2) = ROUND(?, 2)', height).count

Новая проблема заключается в том, что сравнивается число с плавающей точкой на равенство - ROUND(.., 2) несмотря на это. Исправление заключается в сравнении небольшого диапазона:

Model.where(gender: 'female').where('ROUND(?, 2) BETWEEN ROUND(height, 2) - 0.0000001 AND ROUND(height, 2) + 0.0000001', height).count

Может быть доступен менее избыточный метод базы данных для сравнения значений с плавающей точкой по диапазону ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...