Làm thế nào để bạn khám phá các thuộc tính mô hình trong Rails?


142

Tôi thấy khó có thể dễ dàng thấy những thuộc tính / thuộc tính nào tồn tại trên tất cả các lớp mô hình của tôi vì chúng không được xác định rõ ràng trong các tệp lớp của tôi.

Để khám phá các thuộc tính mô hình, tôi giữ tệp giản đồ.rb mở và lật giữa nó và bất kỳ mã nào tôi đang viết khi cần. Điều này hoạt động nhưng rất rắc rối vì tôi phải chuyển đổi giữa việc đọc tệp lược đồ để chọn các thuộc tính, tệp lớp mô hình để kiểm tra các phương thức và bất kỳ mã mới nào tôi đang viết để gọi các thuộc tính & phương thức.

Câu hỏi của tôi là, làm thế nào để bạn khám phá các thuộc tính mô hình khi bạn phân tích một cơ sở mã Rails lần đầu tiên? Bạn có giữ tệp lược đồ.rb luôn mở không, hoặc có cách nào tốt hơn không liên quan đến việc nhảy giữa tệp lược đồ & tệp mô hình không?


7
Cảm ơn câu trả lời dưới đây. Có vẻ như không phải là một cách tốt để khai báo tên thuộc tính trong tệp nguồn mô hình, mà là giữ một thiết bị đầu cuối mở và chọc các đối tượng để tìm ra các thuộc tính của chúng.
gbc

Câu trả lời:


276

Đối với những thứ liên quan đến Schema

Model.column_names         
Model.columns_hash         
Model.columns 

Ví dụ về các biến / thuộc tính trong một đối tượng AR

object.attribute_names                    
object.attribute_present?          
object.attributes

Ví dụ, các phương thức không có sự kế thừa từ siêu lớp

Model.instance_methods(false)

10
Để có được các hiệp hội, bạn có thể làm: Model.reflect_on_all_associations.map (&: name)
vasilakisfil

1
Trong ActiveRecord 5 (và có thể sớm hơn) bạn có thể gọi Model.attribute_names.
aceofbassgreg

27

Có một plugin rails gọi là Annotate model, sẽ tạo các thuộc tính mô hình của bạn trên đầu các tệp mô hình của bạn ở đây là liên kết:

https://github.com/ctran/annotate_models

để giữ chú thích đồng bộ, bạn có thể viết một tác vụ để tạo lại các mô hình chú thích sau mỗi lần triển khai.


3
Trang web mới cho những gì tôi giả sử là cùng một plugin, github.com/ctran/annotate_models
James McMahon

15

Nếu bạn chỉ quan tâm đến các thuộc tính và kiểu dữ liệu từ cơ sở dữ liệu, bạn có thể sử dụng 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)"

Ngoài ra, khi chạy rake db:createrake db:migratecho môi trường phát triển của bạn, tệp db/schema.rbsẽ chứa nguồn có thẩm quyền cho cấu trúc cơ sở dữ liệu của bạn:

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

Để mô tả mô hình tôi sử dụng đoạn mã sau

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

Một lần nữa, đây là nếu bạn đang tìm kiếm một bản in đẹp để mô tả về bạn ActiveRecordmà không cần di chuyển qua máng hoặc nhảy nhà phát triển đó trước khi bạn đủ tốt để nhận xét về các thuộc tính.


Điều này là hoàn hảo để in ra tất cả các thuộc tính của tất cả các phiên bản cho một mô hình cụ thể - cảm ơn!
ConorB

4
some_instance.attributes

Nguồn: blog


some_group.attribut.keys sạch hơn một chút
klochner

tự hỏi nếu có IDE sử dụng điều này để tự động hoàn thành? Có vẻ như một điều rõ ràng để làm cho một mô hình đường ray. Tôi luôn thất vọng khi tôi bắt đầu nhập một tên thuộc tính và nó không tự động hoàn thành.
frankodwyer

2
@frankodwyer - RubyMine thì có, mặc dù tôi chắc chắn phải có người khác.
Matt
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.