1

tl;drArel::Attributes::Attribueオブジェクトが与えられた場合、 Model.arel_table[:created_at]SQL 型を取得する方法を教えてください。

コンテキスト:本当に効率的に生成する必要があるいくつかの SQL レポートを作成するために、Arel を優先して ActiveRecord インフラストラクチャをバイパスしています。Arel のto_sql方法を使用して、最終的な SQL を生成し、.xml を介して直接実行していますActiveRecord::Base.connection.execute。ただし、特定の列に SQL 変換を適用する必要があります (例: GMT に保存されているタイムスタンプのタイムゾーンを変更する)。列の数が多い (そしてユーザー入力に基づいて変化する) ため、これらの変換をハードコーディングしたくありません。選択されている列の SQL タイプを確認し、それに応じて変換を適用したいと思います。

4

2 に答える 2

2

ActiveRecord クラスがセットアップされている場合は、そのcolumnsおよびcolumns_hashメソッドにアクセスできます。これらは列オブジェクト(のインスタンス)を提供し、そこにとメソッドActiveRecord::ConnectionAdapters::Columnを見つける必要があります。例えば:typesql_type

> Model.columns_hash['created_at'].type
 => :datetime 
> Model.columns_hash['created_at'].sql_type
 => "timestamp without time zone"

sql_typeデータベース固有 (上記の PostgreSQL) になりtypeます。 は移行のタイプと一致するため、おそらくsql_type.

そうは言っても、おそらく通常の ActiveRecord リレーション メソッド (変換とタイム ゾーンを処理する必要があります) を使用to_sqlして、最後に次のように呼び出すことができます。

sql = Model.where('created_at > ?', some_time).select('pancakes').to_sql

そして、その SQL をexecuteまたはにフィードしますselect_rows。これにより、気にしない ActiveRecord ラッパーの束を作成するオーバーヘッドを回避しながら、通常の ActiveRecord のほとんどを使用できます。

于 2013-02-03T06:00:04.380 に答える