質問

次の移行があり、環境に関連する現在のデータベースが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 <によって確立されたデータベース接続について知りたいことをすべて提供します。 / code>

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

これは役立つかもしれません:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top