Rails: Return from Query возвращает два разных формата меток времени - PullRequest
1 голос
/ 29 июля 2011

Модель

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": "user@user.com",
        "first": "Test",
        "last": "User"
    }

Заметьте, как create_at выходит как UTC, а "complete_at" выходит по местному времени? Есть идеи, почему или как сделать так, чтобы они были в одном формате?

1 Ответ

1 голос
/ 29 июля 2011

Джон, я не совсем уверен, как именно вы генерируете json, но я бы запустил консоль и посмотрел, смогу ли я выяснить, какой тип объекта datetime вы получаете для каждого столбца.

Кроме того, вы устанавливаете 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, который обрабатывает преобразование часового пояса, здесь .

Стоит отметить, что AR не будет преобразовывать TZ ни в какие столбцы, не входящие в столбец columns_hash, т. Е. Ваш столбец «complete_at» НЕ будет преобразовывать TZ. Я знаю, это похоже на то, что вы испытываете, но может дать вам подсказку.

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