Question

J'ai la migration suivante et je veux pouvoir vérifier si la base de données actuelle liée à l'environnement est une base de données mysql. Si c'est mysql, je souhaite exécuter le code SQL spécifique à la base de données.

Comment puis-je m'y prendre?

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
Était-ce utile?

La solution

ActiveRecord :: Base.connection vous fournira tout ce que vous avez toujours voulu savoir sur la connexion à la base de données établie par boot.rb et environment.rb

ActiveRecord :: Base.connection renvoie beaucoup d'informations. Vous devez donc savoir exactement ce que vous recherchez.

Comme le souligne Marcel:

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

est probablement la meilleure méthode pour déterminer si votre base de données MySQL.

Malgré les informations internes susceptibles de changer entre les versions de ActiveRecord , je préfère le faire de cette manière:

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

Autres conseils

Appel encore plus court

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

Il existe un nom_adaptateur . dans AbstractAdapter et existe depuis Rails2.

Il est donc plus facile d'utiliser la migration comme ceci:

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

Dans Rails 3 (peut-être plus tôt, mais j'utilise actuellement Rails 3), utiliser ActiveRecord :: ConnectionAdapters :: MysqlAdapter est une mauvaise façon de s'y prendre, car il n'est initialisé que si l'adaptateur de base de données utilisé est MySQL. Même si vous avez le joyau MySQL installé, si ce n'est pas votre type de connexion, cet appel échouera:

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

Donc, je recommanderais la réponse de stasl et utiliserait la propriété nom_adaptateur de la connexion.

Cela pourrait aider:

execute 'modifier les utilisateurs de la table modifier fb_user_id bigint WHERE USER () = "mysqluser",'; '' / <;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top