Rails移行でデータベースタイプを確認するにはどうすればよいですか?
-
06-07-2019 - |
質問
次の移行があり、環境に関連する現在のデータベースが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 ;;'