ActiveRecord: Daftar kolom dalam tabel dari konsol

112

Saya tahu bahwa Anda dapat meminta ActiveRecord untuk membuat daftar tabel di konsol menggunakan:

ActiveRecord::Base.connection.tables

Apakah ada perintah yang akan mencantumkan kolom dalam tabel tertentu?

Andrew
sumber

Jawaban:

213

Ini akan mencantumkan nama_kolom dari tabel

Model.column_names
e.g. User.column_names
Pravin
sumber
16
Anda juga bisa menjalankan sesuatu seperti Model.columnsuntuk mendapatkan info lebih lanjut tentang kolom termasuk data konfigurasi database.
srt32
1
Bagus! Menggunakan Model.columnsmenyediakan semua informasi untuk tabel melalui ActiveRecord. Yang terpenting bagi saya itu adalah satu-satunya cara dan termudah untuk mendapatkan keyakinan tentang apa sebenarnya kunci utama saya di tingkat database.
nibbex
2
Anda selalu bisa menggunakan Model.primary_key, yang memberi Anda nama kunci utama menurut rel. (Ini akan menjadi 'id' kecuali dideklarasikan dalam model sebagai sesuatu yang lain).
AJFaraday
57

Ini mendapatkan kolom, bukan hanya nama kolom dan menggunakan ActiveRecord :: Base :: Connection, jadi tidak ada model yang diperlukan. Berguna untuk dengan cepat mengeluarkan struktur db.

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

Contoh keluaran: http://screencast.com/t/EsNlvJEqM

Aaron Henderson
sumber
Di rel 3.2, melakukannya dengan cara ini entah bagaimana tidak menyetel primaryatribut dengan benar (semua kolom memiliki primary=nil). Ini diatur dengan benar dengan Model.columnsmetode yang disarankan oleh srt32.
sayap
1
Ini adalah jawaban yang benar. Tidak ada persyaratan untuk memiliki model. Tidak setiap meja memiliki model. "has_many_and_belongs_to"
baash05
22

Menggunakan rel tiga Anda cukup mengetik nama model:

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

Di rel empat, Anda perlu membuat koneksi terlebih dahulu:

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...)
Yule
sumber
OP hanya menginginkan nama kolom.
Ryan Bigg
Mungkin. Tapi belum tentu. Ini adalah cara alternatif untuk mendapatkannya dengan info tambahan yang terkadang berguna saat membuat daftar kolom dari konsol
Yule
1
Ini juga merupakan metode yang berguna untuk diketahui, IMO. @ Yule - apakah ini menanyakan kode skema / migrasi dll. Atau apakah itu meminta DB? Alasan saya bertanya adalah saya mengalami ketidaksesuaian antara skema saya dan apa yang sebenarnya ada di DB (satu migrasi gagal), jadi secara khusus saya perlu memastikan bahwa saya melihat apa yang sebenarnya ada di tabel.
Andrew
@Andrew itu menanyakan DB (maka kebutuhan untuk membuat koneksi di rel 4)
Yule
5

Jika Anda merasa nyaman dengan perintah SQL, Anda dapat masuk ke folder aplikasi Anda dan menjalankannya rails db, yang merupakan bentuk singkat dari rails dbconsole. Ini akan masuk ke shell database Anda, apakah itu sqlite atau mysql.

Kemudian, Anda dapat membuat kueri kolom tabel menggunakan perintah sql seperti:

pragma table_info(your_table);
gm2008
sumber
1
Untuk penggunaan mySQL describe your_table;, tidak sempurna tetapi berfungsi
valk
2

Anda dapat menjalankan rails dbconsolealat baris perintah untuk membuka konsol sqlite. Kemudian ketik .tablesuntuk mendaftar semua tabel dan .fullschemauntuk mendapatkan daftar semua tabel dengan nama dan tipe kolom.

codeepic
sumber
Anda dapat menggunakan konsol database online (gem activeadmin-sqlpage ) seperti yang dijelaskan dalam jawaban ini jika Anda menggunakan admin aktif.
oklas
1
  • Untuk daftar kolom dalam tabel saya biasanya pergi dengan ini:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Menyortir nama kolom memudahkan untuk menemukan apa yang Anda cari.

  • Untuk informasi lebih lanjut tentang masing-masing kolom menggunakan ini:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Ini akan memberikan hash yang bagus. sebagai contoh:

{
   id => int(4),
   created_at => datetime
}
csebryam.dll
sumber
1

melengkapi informasi yang berguna ini, misalnya menggunakan rails console o rails dbconsole:

Mahasiswa adalah Model saya, menggunakan konsol rel:

$ 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)

Opsi lain menggunakan SQLite melalui Rails:

$ 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);

Terakhir untuk informasi lebih lanjut.

sqlite> .help

Semoga ini membantu!

Gamaliel
sumber
-1

Untuk format yang lebih ringkas, dan lebih sedikit mengetik:

Portfolio.column_types 
valk
sumber
Tidak ada di rel 5+
Pak