คุณจะค้นพบคุณสมบัติของรุ่นใน Rails ได้อย่างไร?


142

ฉันพบว่ามันยากที่จะเห็นว่าคุณสมบัติ / คุณสมบัติใดที่มีอยู่ในคลาสโมเดลของฉันทั้งหมดเนื่องจากไม่ได้กำหนดไว้อย่างชัดเจนในไฟล์คลาสของฉัน

ในการค้นพบคุณลักษณะของโมเดลฉันเปิดไฟล์ schema.rb และพลิกระหว่างมันกับโค้ดที่ฉันเขียนเท่าที่จำเป็น ใช้งานได้ แต่เป็น clunky เพราะฉันต้องสลับระหว่างการอ่านไฟล์ schema เพื่อรับแอตทริบิวต์ไฟล์ class model เพื่อตรวจสอบวิธีการและรหัสใหม่ที่ฉันกำลังเขียนเพื่อเรียก attribute & methods

คำถามของฉันคือคุณจะค้นพบคุณลักษณะของแบบจำลองได้อย่างไรเมื่อคุณวิเคราะห์ codebase ของ Rails เป็นครั้งแรก คุณเปิดไฟล์ schema.rb ไว้ตลอดเวลาหรือมีวิธีที่ดีกว่าที่ไม่เกี่ยวข้องกับการข้ามระหว่างไฟล์ schema และไฟล์ model อย่างต่อเนื่องหรือไม่


7
ขอบคุณสำหรับคำตอบด้านล่าง ดูเหมือนจะไม่มีวิธีที่ดีในการประกาศชื่อแอ็ตทริบิวต์ในไฟล์ต้นฉบับโมเดล แต่ให้เปิดเทอร์มินัลไว้แล้วทำการกระตุ้นวัตถุเพื่อค้นหาคุณสมบัติของมัน
gbc

คำตอบ:


276

สำหรับสิ่งที่เกี่ยวข้องกับสคี

Model.column_names         
Model.columns_hash         
Model.columns 

ตัวอย่างเช่นตัวแปร / คุณสมบัติในวัตถุ AR

object.attribute_names                    
object.attribute_present?          
object.attributes

ตัวอย่างวิธีการที่ไม่มีการสืบทอดจาก super class

Model.instance_methods(false)

10
ในการรับการเชื่อมโยงด้วยคุณสามารถทำได้: Model.reflect_on_all_associations.map (&: name)
vasilakisfil

1
ใน ActiveRecord 5 (และอาจจะก่อนหน้า) Model.attribute_namesคุณสามารถเรียก
aceofbassgreg

27

มีปลั๊กอินรางชื่อแบบจำลองคำอธิบายประกอบที่จะสร้างรูปแบบคุณลักษณะของคุณที่ด้านบนของไฟล์แบบจำลองของคุณที่นี่คือลิงค์:

https://github.com/ctran/annotate_models

เพื่อทำให้บันทึกย่อตรงกันคุณสามารถเขียนงานเพื่อสร้างแบบจำลองคำอธิบายประกอบใหม่หลังจากการปรับใช้แต่ละครั้ง


3
ไซต์ใหม่สำหรับสิ่งที่ฉันถือว่าเป็นปลั๊กอินเดียวกันgithub.com/ctran/annotate_models
James McMahon

15

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

อีกทางเลือกหนึ่งคือการรันrake db:createและrake db:migrateสภาพแวดล้อมการพัฒนาของคุณไฟล์db/schema.rbจะมีแหล่งข้อมูลที่เชื่อถือได้สำหรับโครงสร้างฐานข้อมูลของคุณ:

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

เพื่ออธิบายโมเดลฉันใช้ตัวอย่างต่อไปนี้

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

อีกครั้งนี่คือถ้าคุณกำลังดูพิมพ์สวยเพื่ออธิบายคุณActiveRecordโดยไม่ต้องย้ายข้อมูลรางหรือกระโดดนักพัฒนาที่ก่อนที่คุณจะดีพอที่จะแสดงความคิดเห็นในคุณลักษณะ


นี่คือที่สมบูรณ์แบบสำหรับการพิมพ์คุณสมบัติทั้งหมดของอินสแตนซ์ทั้งหมดสำหรับรุ่นเฉพาะ - ขอบคุณ!
ConorB

4
some_instance.attributes

ที่มา: บล็อก


some_class.attributes.keys มีความสะอาดเป็นเล็ก ๆ น้อย ๆ
klochner

สงสัยว่า IDEs ใดใช้สำหรับการเติมข้อความอัตโนมัติหรือไม่ ดูเหมือนว่าสิ่งที่ชัดเจนที่จะทำสำหรับรูปแบบราง ฉันผิดหวังเสมอเมื่อฉันเริ่มพิมพ์ชื่อแอตทริบิวต์และมันไม่ได้เติมข้อความอัตโนมัติ
frankodwyer

2
@frankodwyer - RubyMine ไม่แม้ว่าฉัน "แน่ใจว่าจะต้องมีคนอื่น ๆ .
แมตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.