ActiveRecord:コンソールからテーブルの列をリスト


112

私はあなたがコンソールでテーブルをリストするようにActiveRecordに頼むことができることを知っています:

ActiveRecord::Base.connection.tables

特定のテーブルの列を一覧表示するコマンドはありますか?

回答:


213

これはテーブルからcolumn_namesをリストします

Model.column_names
e.g. User.column_names

16
Model.columnsデータベース構成データを含む列に関する詳細情報を取得するようなものを実行することもできます。
srt32 2014

1
すごい!を使用Model.columnsすると、ActiveRecordを通じてテーブルのすべての情報が提供されます。私にとって決定的に重要なのは、データベースレベルでの主キーが本当に何であるかを確信するための唯一かつ最も簡単な方法でした。
nibbex 2015年

2
Railsに応じて主キーの名前を提供するModel.primary_keyを常に使用できます。(これは、モデルで他のものとして宣言されていない限り、「id」になります)。
AJFaraday、2015年

57

これは、列名だけでなく列を取得し、ActiveRecord :: Base :: Connectionを使用するため、モデルは必要ありません。データベースの構造をすばやく出力するのに便利です。

ActiveRecord::Base.connection.tables.each do |table_name|
  puts table_name
  ActiveRecord::Base.connection.columns(table_name).each do |c| 
    puts "- #{c.name}: #{c.type} #{c.limit}"
  end
end

出力例:http : //screencast.com/t/EsNlvJEqM


Rails 3.2では、この方法でprimary属性を設定すると、属性が正しく設定されません(すべての列にが含まれますprimary=nil)。Model.columnssrt32が提案する方法で正しく設定されています。
sayap 14

1
これが正解です。モデルを持つ必要はありません。すべてのテーブルにモデルがあるわけではありません。"has_many_and_belongs_to"
baash05

22

Rails 3を使用すると、モデル名を入力するだけで済みます。

> User
gives:
User(id: integer, name: string, email: string, etc...)

Rails 4では、最初に接続を確立する必要があります:

irb(main):001:0> User
=> User (call 'User.connection' to establish a connection)
irb(main):002:0> User.connection; nil #call nil to stop repl spitting out the connection object (long)
=> nil
irb(main):003:0> User
User(id: integer, name: string, email: string, etc...)

OPは列名だけを必要とします。
Ryan Bigg

たぶん。しかし、必ずしもそうではありません。これは、コンソールから列を一覧表示するときに役立つ場合がある追加情報でそれらを取得する別の方法です
Yule

1
これも知っておくと便利な方法です、IMO。@Yule-これはスキーマ/移行コードなどをクエリしますか、それともDBをクエリしますか?私が尋ねる理由は、自分のスキーマと実際にDBにあったもの(1つの移行の不具合)の間で不一致が発生していたため、具体的には、実際にテーブルにあるものを確認している必要があります。
Andrew

@AndrewはDBを照会します(したがって、レール4で接続を確立する必要があります)
Yule

5

SQLコマンドに慣れている場合は、アプリのフォルダーに入ってを実行できます。rails dbこれは、の簡単な形式ですrails dbconsole。sqliteでもmysqlでも、データベースのシェルに入ります。

次に、次のようなsqlコマンドを使用してテーブルの列をクエリできます。

pragma table_info(your_table);

1
mySQLを使用する場合describe your_table;、完璧ではありませんが動作します
valk

2

rails dbconsoleコマンドラインツールで実行して、sqliteコンソールを開くことができます。次に、入力し.tablesてすべてのテーブルをリストし、.fullschema列名とタイプを含むすべてのテーブルのリストを取得します。


アクティブな管理を使用している場合は、この回答で説明されているように、オンラインデータベースコンソール(gem activeadmin-sqlpage)を使用できます。
オクラ2017

1
  • テーブルの列を一覧表示するには、通常、次のようにします
    Model.column_names.sort
    i.e. Orders.column_names.sort

    列名をソートすると、探しているものを簡単に見つけることができます。

  • 各列の詳細については、これを使用してください
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h

これは素晴らしいハッシュを提供します。例えば:

{
   id => int(4),
   created_at => datetime
}

1

たとえば、rails console o rails dbconsoleを使用して、この有用な情報を補足します。

学生は私のモデルで、rails consoleを使用しています:

$ rails console
> Student.column_names
 => ["id", "name", "surname", "created_at", "updated_at"] 

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

Railsを通じてSQLiteを使用する他のオプション:

$ rails dbconsole

sqlite> .help

sqlite> .table
ar_internal_metadata  relatives             schools             
relationships         schema_migrations     students 

sqlite> .schema students
CREATE TABLE "students" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "surname" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

最後に詳細について。

sqlite> .help

お役に立てれば!


-1

よりコンパクトなフォーマットで入力を減らすには:

Portfolio.column_types 

レール5+には存在しません
パック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.