في ريلز، كيف يمكنني تنفيذ كود SQL المباشر على قاعدة بيانات مختلفة؟

StackOverflow https://stackoverflow.com/questions/80859

سؤال

هذا هو الحال.

أنا أكتب تطبيق Rails الذي سيراقب جودة البيانات عبر بعض قواعد البيانات المحددة.وللقيام بذلك، أحتاج إلى أن أكون قادرًا على تنفيذ استعلامات SQL مباشرة عبر قواعد البيانات هذه - والتي بالطبع ليست هي نفسها المستخدمة لتشغيل نماذج تطبيق Rails.باختصار، هذا يعني أنني لا أستطيع استخدام خدعة المرور عبر اتصال ActiveRecord الأساسي.

قواعد البيانات التي أحتاج إلى الاتصال بها غير معروفة في وقت التصميم (على سبيل المثال:لا يمكنني وضع التفاصيل الخاصة بهم في قاعدة البيانات.yaml).بدلاً من ذلك، لدي نموذج "database_details" الذي سيستخدمه المستخدم لإدخال تفاصيل قواعد البيانات التي سينفذ التطبيق الاستعلامات عليها في وقت التشغيل.
لذا فإن الاتصال بقواعد البيانات هذه يكون ديناميكيًا حقًا ويتم حل التفاصيل في وقت التشغيل فقط.

كيف أقوم بذلك؟

شكرًا،
رولو

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

المحلول

لقد واجهت مثل هذا الموقف حيث اضطررت إلى الاتصال بمئات المثيلات المختلفة لتطبيق خارجي، وقمت بعمل تعليمات برمجية مشابهة لما يلي:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

وهذا له فائدة إضافية تتمثل في عدم تغيير اتصال ActiveRecord::Base الذي ترث منه نماذجك، لذا يمكنك تشغيل SQL على هذا الاتصال وتجاهل الكائن عند الانتهاء منه.

نصائح أخرى

يمكنك إنشاء اتصال برمجيًا باستخدام مكالمة كهذه

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

كما ترون يمكنك استبدال somedatabase بقيمة قاعدة بيانات_نموذج.database_name.الشيء نفسه مع adatpter وجميع

وثائق ActiveRecord::Base.found_connection

ثم يمكنك استخدام

ActiveRecord::Base.find_by_sql("select * ") 

لتنفيذ استعلام SQL الخاص بك.

وثائق ActiveRecord::Base.find_by_sql

السيد مات كان على حق إذا كان غير مكتمل

يمكن العثور على مزيد من المعلومات (قديمة ولكنها لا تزال مفيدة لنهج التصميم). هنا وتذكر إعادة الاتصال بقاعدة البيانات العادية عند الانتهاء :)

قد تتمكن من القيام بذلك من خلال self.install_connection

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