ActiveRecord: Liệt kê các cột trong bảng từ bảng điều khiển


112

Tôi biết rằng bạn có thể yêu cầu ActiveRecord liệt kê các bảng trong bảng điều khiển bằng cách sử dụng:

ActiveRecord::Base.connection.tables

Có lệnh nào liệt kê các cột trong một bảng nhất định không?

Câu trả lời:


213

Thao tác này sẽ liệt kê các tên_cột từ một bảng

Model.column_names
e.g. User.column_names

16
Bạn cũng có thể chạy một cái gì đó như Model.columnsđể biết thêm thông tin về các cột bao gồm dữ liệu cấu hình cơ sở dữ liệu.
srt32

1
Tuyệt quá! Việc sử dụng Model.columnscung cấp tất cả thông tin cho một bảng thông qua ActiveRecord. Điều quan trọng đối với tôi, đó là cách duy nhất và dễ dàng nhất để có được niềm tin về khóa chính của tôi thực sự là gì ở cấp cơ sở dữ liệu.
nibbex

2
Bạn luôn có thể sử dụng Model.primary_key, cung cấp cho bạn tên của khóa chính theo đường ray. (Đây sẽ là 'id' trừ khi nó được khai báo trong mô hình là một cái gì đó khác).
AJFaraday

57

Điều này lấy các cột, không chỉ tên cột và sử dụng ActiveRecord :: Base :: Connection, vì vậy không cần mô hình nào. Tiện dụng để nhanh chóng xuất ra cấu trúc của một 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

Đầu ra mẫu: http://screencast.com/t/EsNlvJEqM


Trong rails 3.2, làm theo cách này bằng cách nào đó không đặt primarythuộc tính chính xác (tất cả các cột đều có primary=nil). Nó được đặt đúng với Model.columnsphương pháp được gợi ý bởi srt32.
sayap

1
Đây là câu trả lời đúng. Không có yêu cầu phải có một mô hình. Không phải bàn nào cũng có mô hình. "has_many_and_belongs_to"
baash05

22

Sử dụng đường ray ba, bạn có thể chỉ cần nhập tên mô hình:

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

Trong đường ray bốn, trước tiên bạn cần thiết lập kết nối:

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 chỉ muốn tên cột.
Ryan Bigg

Có lẽ. Nhưng không nhất thiết. Đó là một cách thay thế để lấy chúng với thông tin bổ sung, đôi khi hữu ích khi liệt kê các cột từ bảng điều khiển
Yule

1
Đây cũng là một phương pháp hữu ích cần biết, IMO. @Yule - điều này có truy vấn mã lược đồ / di chuyển, v.v. hay nó truy vấn DB? Lý do tôi hỏi là tôi đã gặp phải sự không khớp giữa lược đồ của mình và những gì thực sự có trong DB (một lần di chuyển bị trục trặc), vì vậy, tôi cần chắc chắn rằng mình đang nhìn thấy những gì thực sự có trong bảng.
Andrew

@ Andrew nó truy vấn DB (vì vậy cần phải thiết lập một kết nối trong đường ray 4)
Yule

5

Nếu bạn cảm thấy thoải mái với các lệnh SQL, bạn có thể nhập thư mục của ứng dụng và chạy rails db, đây là một dạng ngắn gọn của rails dbconsole. Nó sẽ nhập shell của cơ sở dữ liệu của bạn, cho dù đó là sqlite hay mysql.

Sau đó, bạn có thể truy vấn các cột trong bảng bằng lệnh sql như:

pragma table_info(your_table);

1
Đối với việc sử dụng mySQL describe your_table;, không hoàn hảo nhưng hoạt động
valk

2

Bạn có thể chạy rails dbconsolecông cụ dòng lệnh của mình để mở bảng điều khiển sqlite. Sau đó, nhập .tablesđể liệt kê tất cả các bảng và .fullschemađể nhận danh sách tất cả các bảng có tên và kiểu cột.


Bạn có thể sử dụng bảng điều khiển cơ sở dữ liệu trực tuyến (gem activeadmin-sqlpage ) làm mô tả trong câu trả lời này nếu bạn sử dụng quản trị viên hoạt động.
oklas

1
  • Để liệt kê các cột trong một bảng tôi thường đi với điều này:
    Model.column_names.sort.
    i.e. Orders.column_names.sort

    Sắp xếp tên cột giúp bạn dễ dàng tìm thấy những gì bạn đang tìm kiếm.

  • Để biết thêm thông tin về từng cột sử dụng này:
    Model.columns.map{|column| [column.name, column.sql_type]}.to_h.

Điều này sẽ cung cấp một hàm băm đẹp. ví dụ:

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

1

bổ sung thông tin hữu ích này, ví dụ: sử dụng bảng điều khiển rails o rails dbconsole:

Student là Model của tôi, sử dụng bảng điều khiển rails:

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

Tùy chọn khác sử dụng SQLite thông qua 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);

Cuối cùng để biết thêm thông tin.

sqlite> .help

Hi vọng điêu nay co ich!


-1

Để có định dạng nhỏ gọn hơn và ít nhập hơn, chỉ cần:

Portfolio.column_types 

Không tồn tại trong đường ray 5+
Pak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.