Domanda

Ho la seguente migrazione e voglio essere in grado di verificare se il database corrente relativo all'ambiente è un database mysql. Se è mysql, voglio eseguire l'SQL specifico del database.

Come posso procedere?

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
È stato utile?

Soluzione

ActiveRecord :: Base.connection ti fornirà tutto ciò che avresti sempre voluto sapere sulla connessione al database stabilita da boot.rb e environment.rb

ActiveRecord :: Base.connection restituisce molte informazioni. Quindi devi sapere esattamente cosa stai cercando.

Come sottolinea Marcel:

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

è probabilmente il metodo migliore per determinare se il tuo database MySQL.

Nonostante faccia affidamento su informazioni interne che potrebbero cambiare tra la versione ActiveRecord , preferisco farlo in questo modo:

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

Altri suggerimenti

Chiamata ancora più breve

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

Esiste un adapter_name in AbstractAdapter ed è presente da Rails2.

Quindi è più facile da usare nella migrazione in questo modo:

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

In Rails 3, (forse prima, ma attualmente sto usando Rails 3) usare ActiveRecord :: ConnectionAdapters :: MysqlAdapter è un modo scadente per farlo, poiché è inizializzato solo se l'adattatore di database in uso è MySQL. Anche se hai installato la gemma MySQL, se non è il tuo tipo di connessione, quella chiamata fallirà:

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

Quindi, consiglierei la risposta di stasl e usare la proprietà adapter_name della connessione.

Questo potrebbe aiutare:

esegue 'alter tabella utenti modifica fb_user_id bigint DOVE UTENTE () = " mysqluser " ;;'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top