2009-08-17 28 views
107

Tôi đã bắt đầu ứng dụng Rails đầu tiên vào mùa thu năm ngoái và phải đặt trên kệ trong một vài tháng khi công việc trả hết tất cả thời gian của tôi. Bây giờ tôi quan tâm đến việc quay trở lại dự án và đọc qua mã để tìm ra nơi tôi rời đi. Thực tế là Rails tự động tạo các thuộc tính mô hình trong thời gian chạy tiết kiệm rất nhiều kiểu gõ lặp đi lặp lại, nhưng tôi thấy khó khăn để dễ dàng khám phá 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. các tập tin. Để khám phá các thuộc tính mô hình, tôi giữ tệp schema.rb mở và lật giữa nó và bất kỳ mã nào tôi đang viết sử dụng các thuộc tính của mô hình. Điều này làm việc nhưng rất khó khăn vì tôi phải đọc tệp lược đồ để nhận các thuộc tính, tệp lớp mô hình để nhận các phương thức và bất kỳ mã mới nào mà tôi viết để gọi các thuộc tính &.Làm thế nào để bạn khám phá các thuộc tính mô hình trong Rails

Vì vậy, câu hỏi của tôi là, làm cách 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 codebase Rails lần đầu tiên? Bạn có giữ cho tệp schema.rb luôn mở 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 liên tục không?

+6

Cảm ơn câu trả lời bên dưới. Có vẻ như không có cách nào tốt để khai báo các 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à poke các đối tượng để tìm ra các thuộc tính của chúng. – gbc

Trả lời

219

Đối Schema liên quan thứ

Model.column_names   
Model.columns_hash   
Model.columns 

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

object.attribute_names      
object.attribute_present?   
object.attributes 

Đối với phương pháp dụ mà không thừa kế từ siêu lớp

Model.instance_methods(false) 
+9

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

+1

Trong ActiveRecord 5 (và có lẽ trước đó) bạn có thể gọi 'Model.attribute_names'. – aceofbassgreg

4
some_instance.attributes 

Nguồn: blog

+0

some_class.attributes.phím là một chút sạch hơn – klochner

+0

tự hỏi nếu bất kỳ IDE sử dụng này cho 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 gõ tên thuộc tính và nó không tự động hoàn thành. – frankodwyer

+7

Vì 'thuộc tính' là một phương thức thể hiện, ví dụ mã chính xác sẽ là' some_instance.attributes'. – RocketR

24

Có một đường ray cắm gọi là mô hình Chú thích, mà sẽ tạo ra mô hình của bạn thuộc tính trên đỉnh của 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 nhiệm 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ả định là cùng một plugin, https://github.com/ctran/annotate_models –

9

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, sau khi chạy rake db:createrake db:migrate cho môi trường phát triển của bạn, các tập tin db/schema.rb sẽ chứa các nguồn có thẩm quyền đối với 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 
8

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

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 bản in đẹp để mô tả bạn ActiveRecord mà không có bạn đi di chuyển máng hoặc nhảy mà phát triển trước khi bạn đã đủ tốt đẹp để bình luận trong các thuộc tính.

+0

Đ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 cá thể cho một mô hình cụ thể - cảm ơn! – ConorB

Các vấn đề liên quan