الحصول على أنواع من السمات في كائن ActivereCord
-
25-09-2019 - |
سؤال
أود أن أعرف ما إذا كان من الممكن الحصول على الأنواع (كما هو معروف بواسطة AR - على سبيل المثال في البرنامج النصي وقاعدة البيانات) برمجيًا (أعرف أن البيانات موجودة في مكان ما).
على سبيل المثال ، يمكنني التعامل مع جميع أسماء السمات:
ar.attribute_names.each { |name| puts name }
.Attributes تُرجع فقط رسم خرائط للأسماء إلى قيمها الحالية (على سبيل المثال ، لا يوجد معلومات عن النوع إذا لم يتم تعيين الحقل).
بعض الأماكن التي رأيتها مع معلومات النوع:
في البرنامج النصي/وحدة التحكم ، اكتب اسم كيان AR:
>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)
من الواضح أنه يعرف الأنواع. أيضًا ، هناك .column_for_attribute ، الذي يأخذ اسم ATTR ويعيد كائن عمود - والذي يحتوي على النوع المدفون في كائن عمود قاعدة البيانات الأساسي ، ولكن لا يبدو أنه وسيلة نظيفة للحصول عليه.
سأكون مهتمًا أيضًا إذا كانت هناك طريقة ودية لـ "ActiveModel" الجديد الذي سيأتي (Rails3) ويتم فصله عن تفاصيل قاعدة البيانات (ولكن ربما لن تكون المعلومات جزءًا منها ، لا يمكنني أن أبدو عليها اكتشف ما إذا كان).
شكرًا.
المحلول
في Rails 3 ، بالنسبة لـ "برنامج التشغيل" الخاص بك ، تريد Driver.columns_hash
.
Driver.columns_hash["name"].type #returns :string
إذا كنت تريد التكرار من خلالهم ، فستفعل شيئًا كهذا:
Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}
الذي سيؤدي إلى إخراج ما يلي:
id => integer
name => string
created_at => datetime
updated_at => datetime
نصائح أخرى
يمكنك الوصول إلى أنواع الأعمدة عن طريق القيام بذلك:
#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
في Rails 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
التجزئة.
في Rails 5 ، سيعطيك هذا قائمة بجميع أسماء الحقول جنبًا إلى جنب مع نوع البيانات الخاص بهم:
Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end
سوف يمنحك هذا المقتطف جميع سمات النموذج مع أنواع بيانات قاعدة البيانات المرتبطة في تجزئة. فقط استبدل المنشور بنموذج السجل النشط.
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}