次の移行があり、環境に関連する現在のデータベースがmysqlデータベースであるかどうかを確認できるようにしたいと思います。 mysqlの場合は、データベースに固有の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
データベースがMySQLであるかどうかを判断する最良の方法はおそらくです。
ActiveRecord
リリース間で変更される可能性のある内部情報に依存しているにもかかわらず、私は次のようにすることを好みます。
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
さらに短い通話
ActiveRecord::Base.connection.adapter_name == 'MySQL'
adapter_name
in 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
Rails 3、(おそらく以前ですが、現在はRails 3)を使用しています)ActiveRecord :: ConnectionAdapters :: MysqlAdapterを使用するのは適切な方法ではありません使用中のデータベースアダプタがMySQLの場合にのみ初期化されるため、MySQL gemがインストールされていても、接続タイプでない場合、その呼び出しは失敗します。
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プロパティを使用します。