كيف يمكنني التحقق من نوع قاعدة البيانات في ترحيل القضبان؟

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

سؤال

ولدي الهجرة التالية وأريد أن أكون قادرة على معرفة ما اذا كان قاعدة البيانات الحالية المتعلقة بالبيئة هي قاعدة بيانات الخلية. إذا كانت الخلية ثم أريد أن تنفيذ 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";'

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