我有以下迁移,我希望能够检查与环境相关的当前数据库是否是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 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属性。

这可能会有所帮助:

执行'alter table用户修改fb_user_id bigint WHERE USER()=&quot; mysqluser&quot;;'

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top