Activerecord 联接表中的时间戳列变为字符串

Activerecord 联接表中的时间戳列变为字符串,activerecord,Activerecord,我有一个名为subs的表,其中有许多文章。articles表有一个名为published的时间戳列 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)

我有一个名为
subs
的表,其中有许多
文章
articles
表有一个名为
published
的时间戳列

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
对象。

Rails 3

Rails根据其数据库列定义确定如何键入强制转换属性。例如,假设您在
模型上创建了
方法。加载记录时,使用
read\u属性
)。这将使用
type_cast_属性
,该属性确定如何基于列信息强制转换值。例如,如果您正在使用PostgreSQL,它可能会使用:

Sub.columns.detect { |c| c.name == "created_at" }.type_cast_code("v")
=> "ActiveRecord::ConnectionAdapters::PostgreSQLColumn.string_to_time(v)"
但是Rails不知道如何处理不在
Sub
模型中的列。所以它只会返回一个
字符串
。如果需要使用
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时,将创建,并将
列类型
传递给初始值设定项。在您的示例
Sub.select
query中,
published
列将被转换为
Time
对象。

是否知道如何处理此问题?我现在遇到了同样的问题……不,我使用了一个额外的查询语句来获取timestamp列