Pergunta

Eu tenho a seguinte migração e eu quero ser capaz de verificar se o banco de dados atual relacionadas com o meio ambiente é um banco de dados mysql. Se é mysql, em seguida, eu quero executar o SQL que é específico para o banco de dados.

Como posso fazer isso?

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
Foi útil?

Solução

ActiveRecord::Base.connection irá fornecer-lhe tudo o que você sempre quis saber sobre a conexão do banco de dados criado pelo boot.rb e environment.rb

ActiveRecord::Base.connection retorna um monte de informações. Então você tem que saber exatamente o que você está procurando.

Como Marcel aponta:

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

é provavelmente o melhor método para determinar se o seu banco de dados MySQL.

Apesar de depender de informações internas que poderia mudar entre a liberação ActiveRecord, eu prefiro fazê-lo desta maneira:

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"

Outras dicas

Ainda mais apelo mais curto

ActiveRecord::Base.connection.adapter_name == 'MySQL'

Há um adapter_name em AbstractAdapter e que está lá desde Rails2

.

Por isso, é mais fácil de usar na migração como este:

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

No Rails 3, (talvez mais cedo, mas eu estou usando Rails 3 atualmente) usando ActiveRecord :: ConnectionAdapters :: MysqlAdapter é uma má maneira de ir sobre ele, uma vez que só é inicializado se o adaptador de banco de dados em uso é MySQL. Mesmo se você tiver a gema MySQL instalado, se não é o seu tipo de conexão, essa chamada wil falhar:

Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1

Então, eu recomendo a resposta de stasl e use a propriedade adapter_name da conexão.

Isto pode ajudar:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top