ruby on rails - ActiveRecord ऑब्जेक्ट में विशेषताओं के प्रकार प्राप्त करना




ruby-on-rails activemodel (4)

मैं जानना चाहता हूं कि प्रकारों को प्राप्त करना संभव है (जैसा कि एआर द्वारा ज्ञात है - उदाहरण के लिए माइग्रेशन स्क्रिप्ट और डेटाबेस में) प्रोग्रामेटिक रूप से (मुझे पता है कि डेटा कहीं वहां मौजूद है)।

उदाहरण के लिए, मैं सभी विशेषता नामों से निपट सकता हूं:

ar.attribute_names.each { |name| puts name }

.attributes सिर्फ नामों के मैपिंग को उनके वर्तमान मानों पर लौटाता है (उदाहरण के लिए फ़ील्ड सेट नहीं होने पर कोई प्रकार की जानकारी नहीं है)।

कुछ स्थानों पर मैंने इसे प्रकार की जानकारी के साथ देखा है:

स्क्रिप्ट / कंसोल में, एआर इकाई का नाम टाइप करें:

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

तो स्पष्ट रूप से यह प्रकार जानता है। साथ ही, .column_for_attribute है, जो एक एटीआर नाम लेता है और एक कॉलम ऑब्जेक्ट देता है - जिसमें अंतर्निहित डेटाबेस कॉलम ऑब्जेक्ट में दफनाया गया प्रकार है, लेकिन यह इसे प्राप्त करने का एक साफ तरीका प्रतीत नहीं होता है।

मुझे यह भी रूचि होगी कि क्या ऐसा कोई तरीका है जो आने वाले नए "एक्टिवोडेल" के लिए अनुकूल है (रेल 3) और डेटाबेस विनिर्देशों से decoupled है (लेकिन शायद प्रकार की जानकारी इसका हिस्सा नहीं होगा, मैं प्रतीत नहीं कर सकता पता करें कि यह है)।

धन्यवाद।


आप इसे करके कॉलम के प्रकारों तक पहुंच सकते हैं:

#script/console
Driver.columns.each {|c| puts c.type}

यदि आप किसी विशेष मॉडल में सभी कॉलम प्रकारों की एक सूची प्राप्त करना चाहते हैं, तो आप यह कर सकते हैं:

Driver.columns.map(&:type) #gets them all
Driver.columns.map(&:type).uniq #gets the unique ones

यह स्निपेट आपको एक हैश में संबंधित डेटाबेस डेटा प्रकारों के साथ एक मॉडल के सभी गुण देगा। बस अपने सक्रिय रिकॉर्ड मॉडल के साथ पोस्ट को प्रतिस्थापित करें।

Post.attribute_names.map {|n| [n.to_sym,Post.type_for_attribute(n).type]}.to_h

इस तरह एक हैश वापस आ जाएगा।

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 

रेल 5 में यह आपको अपने डेटा प्रकार के साथ सभी फ़ील्ड नामों की एक सूची देगा:

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end

रेल 5 में, आप इसे डेटाबेस से स्वतंत्र रूप से कर सकते हैं। यह महत्वपूर्ण है कि आप (अतिरिक्त) विशेषताओं को परिभाषित करने के लिए नए गुण API का उपयोग करें।

मॉडल श्रेणी से सभी विशेषताओं को प्राप्त करना:

pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

प्रकार प्राप्त करना:

pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

कभी-कभी आवश्यकता से अधिक जानकारी होती है। एक सुविधा फ़ंक्शन है जो इन सभी प्रकारों को कोर सेट पर मैप करता है (: पूर्णांक,: स्ट्रिंग इत्यादि)

> User.type_for_attribute('email').type
=> :string 

आप उन सभी डेटा को attribute_types के साथ एक कॉल में भी प्राप्त कर सकते हैं जो 'name': type हैश 'name': type





activemodel