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列