ruby on rails - الحصول على أنواع السمات في كائن ActiveRecord




ruby-on-rails activemodel (4)

سيعطيك هذا المقتطف جميع سمات النموذج مع أنواع بيانات قاعدة البيانات المرتبطة في التجزئة. ما عليك سوى استبدال المشاركة بنموذج السجل النشط.

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} 

أرغب في معرفة ما إذا كان من الممكن الحصول على الأنواع (كما هو معروف من قبل AR - على سبيل المثال في البرنامج النصي للهجرة وقاعدة البيانات) برمجيًا (أعرف أن البيانات موجودة في مكان ما).

على سبيل المثال ، يمكنني التعامل مع جميع أسماء السمات:

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

. يتم فقط إرجاع سمات التعيين للأسماء إلى قيمها الحالية (على سبيل المثال لا توجد معلومات للنوع إذا لم يتم تعيين الحقل).

بعض الأماكن التي رأيتها مع معلومات النوع:

في البرنامج النصي / وحدة التحكم ، اكتب اسم كائن AR:

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

من الواضح أنه يعرف الأنواع. أيضًا ، يوجد .column_for_attribute ، والذي يأخذ اسم attr ويعرض كائن عمود - الذي يحتوي على النوع المدفون في كائن عمود قاعدة البيانات الأساسي ، ولكن لا يبدو أنه طريقة نظيفة للحصول عليه.

وأود أيضا أن تكون مهتمة إذا كان هناك طريقة ودية لل "ActiveModel" الجديدة التي قادمة (rails3) ويتم فصله عن مواصفات قاعدة البيانات (ولكن ربما لن تكون معلومات النوع جزء منه ، لا أستطيع أن يبدو معرفة ما إذا كان هو).

شكر.


في Rails 3 ، لنموذج "Driver" ، أنت تريد 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

في القضبان 5 سيعطيك هذا قائمة بكافة أسماء الحقول مع نوع بياناتها:

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

يمكنك الوصول إلى أنواع الأعمدة عن طريق القيام بذلك:

#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






activemodel