2012-05-19 4 views
1

У меня есть таблица с именем subs, которая имеет много articles. Таблица articles имеет столбец временной отметки published.Timestamp Column from Entry Table становится строкой

Sub.select("subs.*,MAX(articles.published) published").joins("LEFT OUTER JOIN articles ON subs.id=articles.sub_id").group("subs.id").first.published.class 
=> String 
Article.select("max(published) published").group("id").first.published.class 
=> ActiveSupport::TimeWithZone 

Я хочу, чтобы получить ActiveSupport::TimeWithZone объект обратно с первого запроса.

+0

Когда-либо выясняйте, как с этим бороться? Я сейчас столкнулся с этой проблемой ... – kafuchau

+0

нет, я использовал дополнительную инструкцию запроса для получения столбца временной метки – peon

ответ

0

Rails 3

Rails определяет, как тип атрибутов литых на основе их определений столбцов базы данных. Например, скажем, у вас есть метод created_at на вашей модели Sub. Когда загружается запись, используется read_attribute (ActiveRecord::AttributeMethods::Read). Это использует type_cast_attribute, который определяет, как отличать значение на основе информации о столбце. Например, если вы используете PostgreSQL может использовать:

Sub.columns.detect { |c| c.name == "created_at" }.type_cast_code("v") 
=> "ActiveRecord::ConnectionAdapters::PostgreSQLColumn.string_to_time(v)" 

Но Rails не знает, что делать с колоннами, которые не на Sub модели. Поэтому он просто возвращает String. Если вам нужно работать с ActiveSupport::TimeWithZone объекта, вы можете привести значение с:

published = Sub.select("subs.*,MAX(articles.published) published").joins("LEFT OUTER JOIN articles ON subs.id=articles.sub_id").group("subs.id").first.published 
published.present? ? Time.zone.parse(published) : nil 

Rails 4

В Rails 4, Rails умнее этого рода типа литья. Когда SQL выполняется, создается ActiveRecord::Result, и column_types передаются инициализатору. В вашем примере запроса Sub.select столбец published будет отлит как объект Time.