2011-07-29 66 views
1

模型滑軌:從查詢返回返回兩個不同時間戳的格式

scope :completed_at, select("(
     SELECT goals.created_at 
     FROM goals 
     WHERE goals.user_id = users.id 
     ORDER BY goals.created_at 
     LIMIT 1 
    ) as completed_at 
    ") 

控制器

@users = User.select("email, first, last, created_at").completed_at.order("created_at ASC").limit(1).all 

所得SQL查詢

SELECT email, first, last, created_at, (
SELECT goals.created_at 
FROM goals 
WHERE goals.user_id = users.id 
ORDER BY goals.created_at 
LIMIT 1 
) as completed_at 
FROM "users" ORDER BY created_at ASC LIMIT 5 

樣品JSON輸出

"user": { 
     "completed_at": "2011-06-07 15:04:56", 
     "created_at": "2010-01-01T06:00:00Z", 
     "email": "[email protected]", 
     "first": "Test", 
     "last": "User" 
    } 

請注意created_at如何以UTC出現,但「completed_at」是當地時間?任何想法爲什麼或如何讓他們成爲相同的格式?

+0

你的問題只是不同的格式還是時區問題?如果它只是您可以使用的格式['DATE_FORMAT'](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format) –

+0

我想我可以做到這一點。我想這似乎很奇怪,我必須。想知道爲什麼Rails會返回不同的格式... DATE_FORMAT也是特定於MySQL的,對吧? – jmccartie

回答

1

喬恩,我不確定你是如何生成json的,但是我打開了控制檯,看看我是否可以找出你爲每列獲得什麼類型的日期時間對象。

另外,你是否設置Time.zone?

rails c 
> Time.zone = 'Central Time (US & Canada)' 
> u = User.select("email, first, last, created_at").completed_at.first 
> u.created_at.class 
=> ActiveSupport::TimeWithZone 
> u.completed_at.class 
=> Time # (just a guess) 

AR處理時區轉換的模塊是here

有一點需要注意的是AR不會將TZ轉換爲不在columns_hash中的任何列,即您的'completed_at'列將不會被TZ轉換。我知道,這看起來倒退於你所經歷的,但它可能會給你一個線索。

+0

> u.completed_at.class => String#sadTrombone 我想我會運行in_time_zone('UTC')轉換爲TimeWithZone – jmccartie

+0

喬恩,我認爲這個問題是同樣的問題 - 看起來像AR贏了不會將時間戳從postgres轉換出來,因爲它不知道它是時間戳。 http://stackoverflow.com/questions/5737504/rails-doesnt-convert-timezone-postgresql –

相關問題