ruby-on-rails - remove - rollback migration rails
¿Cómo verifico el tipo de base de datos en una migración de Rails? (5)
En Rails 3, (quizás antes, pero actualmente estoy usando Rails 3) usar ActiveRecord :: ConnectionAdapters :: MysqlAdapter es una manera 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 de 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ía la propiedad adapter_name de la conexión.
Tengo la siguiente migración y quiero poder comprobar 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 para 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
Esto podría ayudar:
execute ''alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";''
Hay un adapter_name
en AbstractAdapter
y está ahí desde Rails2.
Así que 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
Llamada aún más corta
ActiveRecord::Base.connection.adapter_name == ''MySQL''
ActiveRecord::Base.connection
le proporcionará todo lo que siempre quiso saber sobre la conexión de base de datos establecida por boot.rb
y environment.rb
ActiveRecord::Base.connection
devuelve mucha información. Así que tienes que 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 confiar en la información interna que podría cambiar entre las versiones de ActiveRecord
, prefiero hacerlo de esta manera:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"