我有以下迁移,我希望能够检查与环境相关的当前数据库是否是一个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
5 回答
ActiveRecord::Base.connection
将为您提供有关boot.rb
和environment.rb
Build 的数据库连接的所有信息 .ActiveRecord::Base.connection
返回了很多信息 . 所以你正在寻找 .正如马塞尔指出:
可能是确定您的数据库MySQL的最佳方法 .
尽管依赖于可能在
ActiveRecord
版本之间发生变化的内部信息,我更喜欢这样做:更短的电话
AbstractAdapter中有adapter_name,自Rails2以来就是这样 .
因此,在迁移中使用更容易,如下所示:
在Rails 3中,(可能更早,但我目前正在使用Rails 3)使用ActiveRecord :: ConnectionAdapters :: MysqlAdapter是一种很糟糕的方式,因为只有在使用的数据库适配器是MySQL时才会初始化它 . 即使您安装了MySQL gem,如果它不是您的连接类型,那么该调用将失败:
所以,我建议使用stasl的答案并使用连接的adapter_name属性 .
这可能有所帮助:
execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'