在我的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中运行查询的输出
而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。
答案 0 :(得分:0)
好的,我在这里可以看到两个问题,一个是你的结果集错误地输入了类型,第二个是缺少一些列。
就类型转换问题而言,我有两个选择:
task.start_date
和task.start_date_before_type_cast
,task.user_id
和task.user_id_before_type_cast
等),请改用这些属性,您应该看到< strong>“N / A”而不是“2000-01-01 00:00:00” 对于你的第二个问题,虽然列可能看起来并不存在,但这只是因为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"