我有以下迁移和我希望能够检查是否与环境相关的,当前数据库是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
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的宝石,如果它不是你的连接类型,该呼叫失败的西港岛线:
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() = "mysqluser";'