72

プログラムでタイプを取得できるかどうかを知りたいです(ARで知られているように-たとえば、移行スクリプトとデータベースで)(データがどこかに存在することは知っています)。

たとえば、すべての属性名を処理できます。

ar.attribute_names.each { |name| puts name }

.attributes は、名前の現在の値へのマッピングを返すだけです (たとえば、フィールドが設定されていない場合、型情報はありません)。

タイプ情報で見たいくつかの場所:

スクリプト/コンソールで、AR エンティティの名前を入力します。

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

明らかに、それはタイプを知っています。また、属性名を取り、列オブジェクトを返す .column_for_attribute もあります。これは、基礎となるデータベースの列オブジェクトに埋め込まれた型を持っていますが、それを取得するためのクリーンな方法ではないようです。

来る新しい「ActiveModel」(rails3)にやさしく、データベースの詳細から切り離された方法があるかどうかにも興味があります(ただし、おそらく型情報はその一部ではないでしょう。かどうか調べてください)。

ありがとう。

4

8 に答える 8

112

Rails 3 では、モデル「ドライバー」に対して、 が必要ですDriver.columns_hash

Driver.columns_hash["name"].type  #returns :string

それらを繰り返し処理したい場合は、次のようにします。

Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}

次のように出力されます。

id => integer
name => string
created_at => datetime
updated_at => datetime
于 2013-03-27T18:49:59.187 に答える
22

これを行うことにより、列のタイプにアクセスできます。

#script/console
Driver.columns.each {|c| puts c.type}

特定のモデルのすべての列タイプのリストを取得する場合は、次のようにすることができます。

Driver.columns.map(&:type) #gets them all
Driver.columns.map(&:type).uniq #gets the unique ones
于 2010-03-08T06:14:51.907 に答える
0

Foobarあなたのアクティブレコードモデルであると仮定します。次のこともできます。

attributes = Foobar.attribute_names.each_with_object({}) do |attribute_name, hash|
  hash[attribute_name.to_sym] = Foobar.type_for_attribute(attribute_name).type
end

Rails 4 でも動作します

于 2021-09-08T05:59:58.543 に答える