سؤال

أنا على الحصول على بعض الكائنات خارجي المكتبة وأنا في حاجة لتخزين تلك الكائنات في قاعدة البيانات.هل هناك طريقة إنشاء الجداول و العلاقات بدءا من الكائنات ، أو يجب أن حفر لهم وخلق الهجرات ونماذج باليد ؟

وذلك بفضل!روبرتو

هل كانت مفيدة؟

المحلول

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

وأود أن إنشاء الهجرات باليد و الجداول و الحقول قبل خلق وملء لهم في الصفوف حسب الحاجة.

نصائح أخرى

ملاحظة:هذا هو رهيب هاك وعليك أن تكون الملابس من الحشرات لسنوات قادمة ، لكن ومع ذلك من السهل جدا:

هذا يعتمد على القضبان ActiveSupport ، ActiveRecord يجري بالفعل تحميل

أقول لك الحصول على كائن عشوائي من طرف ثالث المكتبات التي لديها 2 المتغيرات سبيل المثال - الطبقة قد تبدو مثل هذا:

class Animal
    attr_accessor :name, :number_of_legs
end
a = SomeThirdPartyLibrary.get_animal

يمكنك استخدام انعكاس لمعرفة أنه اسم ، والأعمدة:

table_name = a.class.to_s.tableize
column_names = a.instance_variables.map{ |n| n[1..-1] } # remove the @
column_types = a.instance_variables.map{ |n| a.instance_variable_get(n).class 
    }.map{ |c| sql_type_for_class(c) } # go write sql_type_for_class please

ثم يمكنك استخدام ActiveRecord الهجرات إلى إنشاء الجدول الخاص بك مثل هذا:

ActiveRecord::Migration.class_eval do
  create_table table_name do |t|
    column_names.zip(column_types).each do |colname, coltype|
      t.column colname, coltype
    end
  end
end

ثم يمكنك أخيرا تعلن activerecord الدرجة التي واجهة مع مجرد إنشاء الجدول.

# Note we declare a module so the new classes don't conflict with the existing ones
module GeneratedClasses; end
eval "class GeneratedClasses::#{a.class} < ActiveRecord::Base; end"

المعزوفة!

الآن يمكنك أن تفعل هذا:

a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save

PS:لا تفعل هذا!

وبصرف النظر عن كونها فظيعة ، إذا القضبان تشغيل التطبيق سوف تفقد كل مفهوم من الفئات التي تم إنشاؤها ، لذلك سوف تحتاج إلى وضع آلية استمرار تلك أيضا.

لدي هذا الوضع الدقيق.يجب قراءة البيانات الخارجية إلى التطبيق والأداء ضرب كبيرة جدا ، أنني المخزن محليا.لقد ذهبت مع الحل حيث لدي, مع مرور الوقت, وضعت مخطط الهجرة من جهة ، التي تعمل مع البيانات, و اسمحوا لي أن تستمر البيانات إلى الجداول.لقد وضعت التخزين المؤقت نظام يعمل عن البيانات و الأداء بشكل ملحوظ.

كل ذلك يقول قد فعلت كل ما باليد و أنا لست نادما على ذلك.أنا يمكن أن يكون لديك الثقة في أن قاعدة البيانات الخاصة بي مستقرة و أنا لا إعادة إنشاء db الجداول على الطاير.لأن ذلك ليس لدي أي قلق حول استقرار بلدي التطبيق.

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

حاول تبحث في بعض ORM الحلول.أو تخزين مثل XML.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top