3

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文字列でエイリアスを作成したり、モデルでエイリアスを定義したりしないことをお勧めしますが、エイリアスが必要なのは1回だけで、表示目的のみであるため、モデルを変更して列のエイリアスを作成したくありません。コントローラのメソッドには、それぞれが独自の列名を持つ複数のselectステートメントが存在する「 case」ステートメントがあります。「if」ステートメントを使用せずに、しっかりと表示するためにエイリアスを作成する必要があります。

4

1 に答える 1

2

を介してpostgresクエリのタイプを取得します ftype。ActiveRecordは、postgresアダプター(メソッド #result_as_array)でこの情報を使用して、列をエスケープする必要がある場所をチェックし、この情報を破棄します。

さらなるデータフローについての私の推測では、列名を取得し、データベースからのリフレクションを介して取得したデータを使用してタイプを判別します。基本タイプはですので、わかりStringます。したがって、railsが期待する列タイプを使用するか、postgresアダプターとActiveRecordをハックして、を介して列タイプを要求しますftype

tl; dr:Ruby側(モデルのどこか)でエイリアスを作成するARはあなたがしていることを気に入らない。

于 2012-05-28T12:06:42.333 に答える