質問

プログラムで(私は、データがどこかに存在することがわかっている) - (移行スクリプトとデータベースに例えばARで知られているように)

私は種類を取得することが可能であるかどうかを知りたいです。

たとえば、私はすべての属性名を扱うことができます:

ar.attribute_names.each { |name| puts name }
.attributesだけ(例えばフィールドが設定されていない場合は、no型情報)現在の値に名前のマッピングを返します。

私は型情報でそれを見ているいくつかの場所:

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

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)
だから、明らかにそれはタイプを知っています。また、そこにATTR名を受け取り、列オブジェクトを返します.column_for_attribute、である - 基礎となるデータベースの列オブジェクトに埋め込み型を持っていますが、それを得るためにきれいな方法であることが表示されません。

私はまた、(rails3)に来ていると、データベースの仕様から分離された(おそらく情報は、その一部ではありません入力し、新たな「ActiveModel」のための友好的な方法がある場合、私は」することができますに興味がありますtはそれがある場合)を見つけるように見えます。

ありがとう。

役に立ちましたか?

解決

での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

他のヒント

あなたはこれを行うことによって、列の型にアクセスすることができます:

#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
5 Railsでは、あなたは、独立して、データベースのこの操作を行うことができます。あなたは属性(追加)を定義するための新しい属性APIを使用する場合それは重要なのです。

モデルクラスからすべての属性を取得ます:

pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

のタイプを取得します

pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

必要以上に時々より多くの情報です。コアセットに至るまで、すべてのこれらのタイプをマップする便利な機能があります(:整数、:文字列など)が

> User.type_for_attribute('email').type
=> :string 

また'name': typeハッシュを返すattribute_typesと1回の呼び出しですべてのデータを取得することができます。

はでは、これはあなたに彼らのデータ・タイプと一緒にすべてのフィールド名のリストが表示されます5レール

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end

このスニペットは、あなたのハッシュで、関連するデータベースのデータ型を持つモデルのすべての属性を与えます。ちょうどあなたのActive Recordのモデルとポストを交換してください。

Post.attribute_names.map {|n| [n.to_sym,Post.type_for_attribute(n).type]}.to_h

このようなハッシュを返します。

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top