Railsでモデル属性をどのように発見しますか?


142

クラスファイルで明示的に定義されていないため、すべてのモデルクラスにどの属性/プロパティが存在するかを簡単に確認するのは困難です。

モデルの属性を見つけるために、schema.rbファイルを開いたままにし、必要に応じて、それと、作成しているコードを切り替えます。これは機能しますが、属性を取得するためのスキーマファイルの読み取り、メソッドをチェックするためのモデルクラスファイル、および属性とメソッドを呼び出すために作成する新しいコードを切り替える必要があるため、扱いにくいです。

私の質問は、Railsコードベースを初めて分析するときに、モデル属性をどのようにして発見するのですか?schema.rbファイルを常に開いたままにしていますか、それとも、スキーマファイルとモデルファイルの間を絶えずジャンプしない方法がありますか?


7
以下の回答をありがとう。モデルのソースファイルで属性名を宣言する良い方法はないようですが、ターミナルを開いたままにして、オブジェクトをつついてプロパティを調べます。
gbc

回答:


276

スキーマ関連のもの

Model.column_names         
Model.columns_hash         
Model.columns 

ARオブジェクトのインスタンス変数/属性の場合

object.attribute_names                    
object.attribute_present?          
object.attributes

スーパークラスから継承されていないインスタンスメソッドの場合

Model.instance_methods(false)

10
関連も取得するには、次のようにします。Model.reflect_on_all_associations.map(&:name)
vasilakisfil '28

1
ActiveRecord 5(およびおそらく以前のバージョン)では、を呼び出すことができますModel.attribute_names
aceofbassgreg

27

モデルに注釈を付けるRailsプラグインがあり、モデルファイルの上部にモデル属性を生成します。ここにリンクがあります。

https://github.com/ctran/annotate_models

アノテーションの同期を維持するために、デプロイのたびにアノテーションモデルを再生成するタスクを作成できます。


3
私が想定している新しいサイトは同じプラグイン、github.com / ctran / annotate_modelsです
James McMahon

15

データベースのプロパティとデータ型だけに関心がある場合は、を使用できますModel.inspect

irb(main):001:0> User.inspect
=> "User(id: integer, email: string, encrypted_password: string,
 reset_password_token: string, reset_password_sent_at: datetime,
 remember_created_at: datetime, sign_in_count: integer,
 current_sign_in_at: datetime, last_sign_in_at: datetime,
 current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime,
 updated_at: datetime)"

また、実行したrake db:createrake db:migrate開発環境のために、ファイルにはdb/schema.rb、データベース構造の信頼できるソースが含まれます。

ActiveRecord::Schema.define(version: 20130712162401) do
  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

10

モデルを説明するには、次のスニペットを使用します

Model.columns.collect { |c| "#{c.name} (#{c.type})" }

繰り返しになりますが、これは、ActiveRecord十分な移行を行ったり、属性でコメントするのに十分な前にその開発者を飛ばしたりせずに、あなたを説明するためにきれいに印刷している場合です。


これは、特定のモデルのすべてのインスタンスのすべての属性を出力するのに最適です。ありがとうございます。
ConorB 2016年

4
some_instance.attributes

出典:ブログ


some_class.attributes.keysはもう少しきれいです
klochner

IDEがこれをオートコンプリートに使用するかどうか疑問に思いますか?Railsモデルに対して行うべき明らかなことのようです。属性名の入力を開始すると、常にがっかりし、オートコンプリートは行われません。
frankodwyer 09

2
@frankodwyer - I "メートル必ず他の人がなければならないが、ルビーマインは、ありません。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.