आप रेल में मॉडल विशेषताओं की खोज कैसे करते हैं?


142

मुझे आसानी से यह देखना मुश्किल हो रहा है कि मेरी सभी मॉडल कक्षाओं में क्या विशेषताएँ / गुण मौजूद हैं क्योंकि वे मेरी कक्षा की फाइलों में स्पष्ट रूप से परिभाषित नहीं हैं।

मॉडल विशेषताओं की खोज करने के लिए, मैं स्कीमा.rb फ़ाइल को खुला रखता हूं और इसके बीच और जो भी कोड लिख रहा हूं उसे जरूरत के अनुसार फ्लिप करता हूं। यह काम करता है लेकिन क्लूनी है क्योंकि मुझे विशेषताओं को चुनने के लिए स्कीमा फ़ाइल को पढ़ने के बीच स्विच करना पड़ता है, तरीकों की जाँच करने के लिए मॉडल क्लास फ़ाइल, और जो भी नए कोड मैं कॉल करने के लिए लिख रहा हूँ विशेषताएँ और विधियाँ।

मेरा सवाल यह है कि जब आप पहली बार रेल कोडबेस का विश्लेषण कर रहे हैं तो आपको मॉडल विशेषताओं की खोज कैसे होगी? क्या आप स्कीमा.आरबी फ़ाइल को हर समय खुला रखते हैं, या क्या कोई बेहतर तरीका है जो स्कीमा फ़ाइल और फ़ाइल फ़ाइल के बीच लगातार कूदना शामिल नहीं करता है?


7
नीचे दिए गए उत्तर के लिए धन्यवाद। ऐसा लगता है कि मॉडल स्रोत फ़ाइल में विशेषता नामों की घोषणा करने का एक अच्छा तरीका नहीं है, बल्कि एक टर्मिनल खुला रखें और उनके गुणों का पता लगाने के लिए वस्तुओं को पोक करें।
gbc

जवाबों:


276

स्कीमा से संबंधित सामान के लिए

Model.column_names         
Model.columns_hash         
Model.columns 

उदाहरण के लिए AR ऑब्जेक्ट में चर / विशेषताएँ

object.attribute_names                    
object.attribute_present?          
object.attributes

उदाहरण के लिए सुपर क्लास से विरासत के बिना तरीके

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
जेम्स मैकमोहन

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 थोड़ा साफ है
क्लोचन

आश्चर्य है कि अगर कोई भी IDE स्वतः पूर्णता के लिए इसका उपयोग करता है? रेल मॉडल के लिए एक स्पष्ट बात की तरह लगता है। जब मैं एक विशेषता नाम लिखना शुरू करता हूं तो मैं हमेशा निराश होता हूं और यह स्वतः पूर्ण नहीं होता है।
फ्रैंककोडियर

2
@frankodwyer - RubyMine करता है, हालांकि मैं "यकीन है कि वहाँ दूसरों होना चाहिए।
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.