0

2 つのテーブルに基づく Rails AREL クエリ結果の json 応答を送信しました。応答には、updated_at と updated_at_table_2 の 2 つのタイムスタンプ列が含まれます。ActiveSupport::TimeWithZone.as_json メソッドをオーバーライドして、JSON の目的の日時形式を取得します。同じアプローチが次の場所に示されています。

http://stackoverflow.com/questions/2937740/rails-dates-with-json

私の現在の JSON 応答は次のとおりです。

私はそれらが同じであることを望みます。以下のRailsコードに依存してjsonを生成します。

render :json => { :customer_order  =>  @customer_order  }

@custoemr_order から派生した場所:

CustomerOrder.select(%Q[
      updated_at,
      c.updated_at as updated_at_table_2
    ] ).
    joins( %{ as co inner join customers as c on (co.customer_id = c.id)

質問:Rails 3 に as_json を updated_at_table_2 と updated_at 列と同じ方法で処理するように指示するにはどうすればよいですか?

提案/ポインタも素晴らしいです。

注: この投稿では、同じ根本的な問題 (json についてではありません) について質問していることがわかりましたが、適切な解決策はありませんでした。:

http://stackoverflow.com/questions/12067173/rails-postgres-not-returning-timezone-info-on-column-from-joined-table
4

1 に答える 1

1

クエリの結果を見ると、どこが間違っているかが正確にわかります。

 > o = CustomerOrder.select(%Q[ ... ]).joins(...)
 > puts o.updated_at.class
=> ActiveSupport::TimeWithZone
 > puts o.updated_at_table_2.class
=> String

ActiveRecord は、それがどのようなものであるかを知る方法がないupdated_at_table_2ため、文字列のままにしておくと、to_jsonモンキー パッチは文字列に適用されません。

モンキー パッチを使い続けたい場合to_json(これは悪い考えだと思います)、手動で次のようなものに変換updated_at_table_2する必要があります。ActiveSupport::TimeWithZone

x = ActiveSupport::TimeWithZone.new(
    Time.parse(o.updated_at_table_2),
    Time.zone
)
# x is now an ActiveSupport::TimeWithZone

または、関連付けられたオブジェクトをロードしてそれを呼び出すこともできますupdated_at

ただし、アプローチ全体を破棄します。サーバーをUTCでのみ動作させ、クライアントのタイムスタンプをISO-8601形式で送信し、クライアントにローカルタイムゾーンの適用を処理させます。

于 2012-10-27T05:30:37.787 に答える