46

次の移行があり、環境に関連する現在のデータベースがmysqlデータベースであるかどうかを確認できるようにしたいと思います。mysqlの場合は、データベースに固有のSQLを実行したいと思います。

どうすればこれを行うことができますか?

クラス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")
  終わり

  def self.down
    remove_column:users、:fb_user_id
    remove_column:users、:email_hash
  終わり

終わり
4

5 に答える 5

59

さらに短い通話

ActiveRecord::Base.connection.adapter_name == 'MySQL'
于 2010-03-29T08:59:59.467 に答える
45

ActiveRecord::Base.connectionboot.rbによって確立されたデータベース接続について知りたいと思っていたすべてを提供しますenvironment.rb

ActiveRecord::Base.connection多くの情報を返します。そのため、自分が探しているものを正確に知る必要があります。

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

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

データベースが MySQL.

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

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
于 2009-10-27T03:38:52.893 に答える
28

Rails2 からあるinadapter_nameがあります。AbstractAdapter

したがって、次のように移行で使用する方が簡単です。

adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :mysql, :mysql2
  # do the MySQL part
when :sqlite
  # do the SQLite3 part
when :postgresql
  # etc.
else
  raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end
于 2011-04-14T15:51:44.057 に答える
8

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

于 2011-01-21T19:21:47.667 に答える
-4

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

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

于 2009-10-27T03:37:50.710 に答える