Pregunta

Tengo la siguiente migración y quiero poder verificar si la base de datos actual relacionada con el entorno es una base de datos mysql. Si es mysql, entonces quiero ejecutar el SQL que es específico de la base de datos.

¿Cómo hago esto?

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
¿Fue útil?

Solución

ActiveRecord :: Base.connection le proporcionará todo lo que siempre quiso saber sobre la conexión a la base de datos establecida por boot.rb y environment.rb

ActiveRecord :: Base.connection devuelve mucha información. Así que debes saber exactamente lo que estás buscando.

Como señala Marcel:

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

es probablemente el mejor método para determinar si su base de datos MySQL.

A pesar de depender de información interna que podría cambiar entre el lanzamiento de ActiveRecord , prefiero hacerlo de esta manera:

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

Otros consejos

Llamada aún más corta

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

Hay un adapter_name en AbstractAdapter y eso está allí desde Rails2.

Por lo tanto, es más fácil de usar en la migración de esta manera:

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

En Rails 3, (tal vez antes, pero estoy usando Rails 3 actualmente) usar ActiveRecord :: ConnectionAdapters :: MysqlAdapter es una forma pobre de hacerlo, ya que solo se inicializa si el adaptador de base de datos en uso es MySQL. Incluso si tiene instalada la gema MySQL, si no es su tipo de conexión, esa llamada fallará:

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

Por lo tanto, recomendaría la respuesta de stasl y usar la propiedad del nombre del adaptador de la conexión.

Esto podría ayudar:

execute 'alter table usuarios modifican fb_user_id bigint WHERE USER () = " mysqluser " ;;'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top