在Rails中使用Model.find_by_query时查询结果的差异

时间:2012-04-02 08:22:33

标签: ruby-on-rails

在我的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 :(得分:0)

好的,我在这里可以看到两个问题,一个是你的结果集错误地输入了类型,第二个是缺少一些列。

就类型转换问题而言,我有两个选择:

  1. 无需进行类型转换即可访问数据。 rails模型上的每个属性都有相应的'_before_type_cast'属性(例如task.start_datetask.start_date_before_type_casttask.user_idtask.user_id_before_type_cast等),请改用这些属性,您应该看到< strong>“N / A”而不是“2000-01-01 00:00:00”
  2. 使用不同的别名(例如SELECT“N / A”作为new_start_date),rails应将其作为原始列读取,并且不会对其进行任何类型转换。
  3. 对于你的第二个问题,虽然列可能看起来并不存在,但这只是因为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"