разница в результате запроса при использовании Model.find_by_query в Rails - PullRequest
0 голосов
/ 02 апреля 2012

В моем приложении rails я выполняю запрос на объединение, используя Model.find_by_query

Поскольку таблицы имеют разное количество столбцов, я использую виртуальные столбцы.

Мой запрос выглядит как

"SELECT id,  'N/a' AS start_time,  'N/a' AS end_time,  'N/a' AS 
STATUS , project_id, spent_on AS DATE, user_id, hours AS spent_time, comments AS 
COMMENT , activity_id
FROM table1
WHERE spent_on > DATE_ADD( CURDATE( ) , INTERVAL -30
DAY ) 
AND user_id =80
UNION (

SELECT id, start_time, end_time, 
STATUS , project_id, DATE, user_id, spent_time, 
COMMENT , activity_id
FROM table2
WHERE user_id =80
AND DATE > DATE_ADD( CURDATE( ) , INTERVAL -30 DAY )
)"

Я получаю правильный вывод при выполнении запроса в mysql, но выполнение того же запроса с Model.find_by_sql дает мне другой вывод

Это вывод, который я получаю при выполнении запроса в mysql

enter image description here

, в то время как Model.find_by_sql () возвращает только несколько столбцов,

<Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9>

Также обратите внимание на несоответствие значений.вместо «N / A» я получаю «2000-01-01 00:00:00» в полях времени.

Я понял, что «N / A» преобразуется в «2000-01-01 00:00:00 ", потому что тип поля - время.поэтому Rails преобразует его в некоторое значение времени.

Но могу ли я переопределить это?

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

Комментарии, пожалуйста?

Thnx.

1 Ответ

0 голосов
/ 02 апреля 2012

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

У вас есть два варианта, насколько я могуМожно увидеть проблему с типизацией:

  1. Доступ к данным без приведения типов.Каждый атрибут в модели рельсов имеет соответствующий атрибут _before_type_cast (например, task.start_date и task.start_date_before_type_cast, task.user_id и task.user_id_before_type_cast и т. Д.), Используйте эти атрибуты вместо этого, и вы должны увидеть "N / A" вместо "2000-01-01 00:00:00"
  2. Используйте другой псевдоним (например, SELECT "N / A" в качестве new_start_date), чтобы рельсы читали его какнеобработанный столбец и не будет выполнять в нем типизацию.

Для вас вторая проблема, хотя столбцы могут отсутствовать, это только потому, что метод inspect (который печатаетиз приведенного выше кода) знаю только о столбцах таблицы базы данных задач, а не о столбцах в запросе SQL.Однако данные есть и могут быть доступны как любой другой атрибут.

>> results = Model.find_by_sql('SELECT columns FROM table WHERE conditions')
>> results[0]
=> <Task id: 6153, start_time: "2000-01-01 00:00:00", end_time: "2000-01-01 00:00:00", project_id: 6, spent_time: 10.0, user_id: 80, activity_id: 9>
>> results[0].comment
=> "test"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...