Come controllo il tipo di database in una migrazione di Rails?
-
06-07-2019 - |
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
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 " ;;'