وحدة التحكم في Rails لا تقوم بتحميل النماذج تلقائيًا لـ 2nd DB
-
03-07-2019 - |
سؤال
لديّ مشروع Rails يحتوي على قاعدة بيانات Postgres للتطبيق الفعلي ولكنه يحتاج إلى سحب مجموعة كبيرة من البيانات من قاعدة بيانات Oracle.
database.yml تبدو مثل
development:
adapter: postgresql
database: blah blah
...
oracle_db:
adapter: oracle
database: blah blah
نماذج بلدي التي تنحدر من البيانات على Oracle DB تبدو مثل
class LegacyDataClass < ActiveRecord::Base
establish_connection "oracle_db"
set_primary_key :legacy_data_class_id
has_one :other_legacy_class, :foreign key => :other_legacy_class_id_with_funny_column_name
...
end
الآن ، من العادة غالبًا ما أقوم بالكثير من تطوري المبكر (وهذا هو التطور المبكر) عن طريق الترميز قليلاً ثم اللعب في وحدة التحكم في Rails. على سبيل المثال ، بعد تحديد جميع الجمعيات لـ LegacyDataclass ، سأبدأ في تجربة أشياء مثل a = LegacyDataClass.find(:first); puts a.some_association.name
. بشكل غير متوقع ، يموت هذا مع LegacyDataclass لم يتم تحميله بالفعل.
يمكنني حينها require 'LegacyDataClass'
الذي يحدد المشكلة حتى أحتاج إلى ذلك reload!
, ، والتي لن تعيد تحميلها فعليًا ، أو حتى أفتح مثيلًا جديدًا من وحدة التحكم.
هكذا الأسئلة:
- لماذا هل يحدث هذا؟ من الواضح أن هناك بعض السحر القضبان الذي لا أفهمه.
- ما هي القضبان المريحة الحل البديل?
المحلول
أعتقد أن هذا قد يكون له علاقة باسم النموذج الخاص بك ، بدلاً من اتصالك. اتفاقية Rails هي أن أسماء فئات النماذج هي Camelcase ، في حين أن الملفات التي يقيمون فيها هي Secondcase+Sewrerscore.
لذلك يجب أن تكون فئة "modemodel" في models/legacy_model.rb
. بيانك عن "require 'LegacyDataClass'"
يشير إلى أن هذا ليس هو الحال ، وبالتالي لا يعرف القضبان كيفية تحميل هذا النموذج تلقائيًا.
نصائح أخرى
لقد كتبت شيئًا لتطبيقًا في العمل يتعامل مع الاتصالات لقواعد البيانات الأخرى في وقت التشغيل ، فقد يكون من الممكن المساعدة.