web-dev-qa-db-ja.com

Rails Migration)でデータベースタイプを確認するにはどうすればよいですか?

次の移行があり、環境に関連する現在のデータベースが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 
44
Shaun F

ActiveRecord::Base.connectionは、boot.rbenvironment.rbによって確立されたデータベース接続について知りたいと思ったことすべてを提供します。

ActiveRecord::Base.connectionは多くの情報を返します。だからあなたはあなたが探しているものを正確に知る必要があります。

マルセルが指摘するように:

ActiveRecord::Base.connection.instance_of? 
  ActiveRecord::ConnectionAdapters::MysqlAdapter 

データベースがMySQLであるかどうかを判断する最良の方法はおそらくです。

ActiveRecordリリース間で変更される可能性のある内部情報に依存しているにもかかわらず、私は次のようにすることを好みます。

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
42
EmFi

さらに短い通話

ActiveRecord::Base.connection.adapter_name == 'MySQL'
58
stasl

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
27
KARASZI István

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プロパティを使用します。

8
ctide