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