Rails选择 - 不需要的自动类型转换

时间:2012-05-28 11:19:17

标签: ruby-on-rails database type-conversion

DBMS是PostgreSQL。

在控制器中:

@data = current_user.myitems.all(:select => 'record_date, count(record_date) as value', :group => 'record_date')

在视图中:

<% @data.each do |item| -%>
   <%= item.record_date.utc.strftime('%Y%m%d') %>
<% end -%>

一切都很好。

但如果我更改日期字段名称:

@data = current_user.myitems.all(:select => 'record_date as recdate, count(record_date) as value', :group => 'record_date')

<% @data.each do |item| -%>
   <%= item.recdate.utc.strftime('%Y%m%d') %>
<% end -%>

我收到错误消息:

undefined method `utc' for "2012-02-09 17:03:47":String

WTF ?? !!我没有命令将类型强制转换为字符串!!!

您可能建议不要在SQL字符串中创建别名或在模型中定义别名,但我不想更改模型以为列创建别名,因为我只需要一次别名并仅用于显示目的。 Controller的方法有“ case ”语句,其中多个选择语句存在,每个都有自己的列名。我需要制作别名以获得可靠的视图,而不需要“if”语句。

1 个答案:

答案 0 :(得分:2)

您可以通过获取postgres查询的类型 ftype。 ActiveRecord在postgres适配器中使用此信息(方法 #result_as_array)检查列需要转义的位置 抛弃这些信息。

我对进一步数据流的猜测是它需要列 命名并使用通过数据库反射获得的数据 确定类型。由于基本类型是String,你可以得到它。 因此,使用rails期望的列类型或破解postgres适配器 和ActiveRecord通过ftype询问列类型。

tl; dr:别名Ruby方面的东西(在某个模型中)AR 不喜欢你在做什么。