2009-10-27 7 views
41

次の移行があり、環境に関連する現在のデータベースがmysqlデータベースであるかどうかを確認したいと考えています。それはmysqlの場合は、データベースに固有のSQLを実行したいです。Railsの移行でデータベースの種類を確認するにはどうすればよいですか?

どうすればよいですか?あなたが今までboot.rbenvironment.rb

ActiveRecord::Base.connectionによって確立されたデータベース接続について知りたいと思った

execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'

答えて

37

ActiveRecord::Base.connectionはすべてを提供します多くの情報を返します。

 
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 
+1

'ActiveRecord :: Base.connection.instance_of? ActiveRecord :: ConnectionAdapters :: MysqlAdapter'で解決するはずです。 –

-4

これは役立つかもしれません。だからあなたはあなたが探しているものを正確に知る必要があります。マルセルとして

は指摘:

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

は、おそらく、データベースのMySQLかどうかを決定する最良の方法です。

ActiveRecordリリースの間で変更される可能性が内部情報を頼りにもかかわらず、私はそれをこのようにやって好む:

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql" 
+1

それは動作しません、ユーザーが異なるとするために、 'USER()'関数が定義されていない任意のデータベースを動作しないとき例えばSQLite。 –

55

さらに短いコールのRails 3では

ActiveRecord::Base.connection.adapter_name == 'MySQL' 
+6

私はmysql2 gemを使用していますが、この時点で他の人がいるかもしれないと思うので、次のように使用します: 'ActiveRecord :: Base.connection.adapter_name.downcase.starts_with? 'mysql'' – bensnider

+5

'ActiveRecord :: Base.connection.adapter_name ==「Mysql2」はRails 4で動作しました。 – Jason

8

、(多分早く、しかし、 ActiveRecord :: ConnectionAdapters :: MysqlAdapterを使用しているRails 3を使用しています)は、使用するデータベースアダプタがMySQLの場合にのみ初期化されるため、問題はありません。あなたはそれがあなたの接続タイプではない場合は、MySQLの宝石は、インストールされている場合でも、その呼び出しは失敗ウィル:

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

25

AbstractAdapteradapter_nameがあります。それは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 
+2

これはmysql2 gemでは動作しません。行を' '' :mysql、:mysql2'''。 – mrm

+0

あなたの答えはより完全で清潔です。ありがとう。 – cassioscabral

+0

投稿者: ' def is_postgres? name = ActiveRecord :: Base.connection.adapter_name.downcase name =〜/ postgres/ end ' – Blaskovicz

関連する問題