كيف يمكنني التحقق من نوع قاعدة البيانات في ترحيل القضبان؟
-
06-07-2019 - |
سؤال
ولدي الهجرة التالية وأريد أن أكون قادرة على معرفة ما اذا كان قاعدة البيانات الحالية المتعلقة بالبيئة هي قاعدة بيانات الخلية. إذا كانت الخلية ثم أريد أن تنفيذ SQL غير محددة إلى قاعدة البيانات.
كيف أذهب عن هذا؟
class AddUsersFb < ActiveRecord::Migration def self.up add_column :users, :fb_user_id, :integer add_column :users, :email_hash, :string #if mysql #execute("alter table users modify fb_user_id bigint") end def self.down remove_column :users, :fb_user_id remove_column :users, :email_hash end end
المحلول
وActiveRecord::Base.connection
سوف توفر لك كل ما تريد معرفته عن اتصال قاعدة البيانات التي أنشأتها boot.rb
وenvironment.rb
وActiveRecord::Base.connection
إرجاع الكثير من المعلومات. لذلك عليك أن تعرف بالضبط ما كنت أبحث عنه.
وكما يشير مارسيل بها:
ActiveRecord::Base.connection.instance_of?
ActiveRecord::ConnectionAdapters::MysqlAdapter
وربما تكون أفضل طريقة لتحديد ما إذا كانت الخلية قاعدة البيانات الخاصة بك.
وعلى الرغم من الاعتماد على المعلومات الداخلية التي يمكن أن تتغير بين الإفراج ActiveRecord
، انا افضل تفعل ذلك بهذه الطريقة:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
نصائح أخرى
وحتى أكثر دعوة أقصر
ActiveRecord::Base.connection.adapter_name == 'MySQL'
وهناك مثل adapter_name
في <لأ href = "HTTP : //api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/AbstractAdapter.html "> AbstractAdapter
وأن هناك منذ Rails2
وهكذا فإنه من السهل لاستخدامها في الهجرة من هذا القبيل:
adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :mysql
# do the MySQL part
when :sqlite
# do the SQLite3 part
when :postgresql
# etc.
else
raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end
في القضبان 3، (ربما في وقت سابق، ولكن أنا باستخدام القضبان 3 حاليا) باستخدام أكتيفيريكورد :: :: ConnectionAdapters MysqlAdapter هو وسيلة الفقراء للذهاب حول هذا الموضوع، كما أنها تهيئة إلا إذا كان المحول قاعدة البيانات في الاستخدام هو الخلية. حتى إذا كان لديك جوهرة الخلية تثبيت، إذا لم يكن نوع الاتصال الخاص بك، فيل تفشل تلك الدعوة:
Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1
وهكذا، وأنا أنصح الجواب stasl واستخدام الخاصية ADAPTER_NAME الاتصال.
وهذا قد يساعد على:
وexecute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'