46 votes

Comment puis-je vérifier le type de Base de données dans un Rails de la Migration?

J'ai la suite de la migration et je veux être en mesure de vérifier si la base de données actuelle relative à l'environnement est une base de données mysql. Si c'est mysql alors je veux exécuter le SQL qui est spécifique à la base de données.

Comment puis-je aller à ce sujet?

classe AddUsersFb < ActiveRecord::Migration

 def self.jusqu'
 add_column :utilisateurs :fb_user_id, :integer
 add_column :utilisateurs :email_hash, :string
 #si mysql
 #execute("alter table aux utilisateurs de modifier fb_user_id bigint")
fin

 def self.en bas
 remove_column :utilisateurs :fb_user_id
 remove_column :utilisateurs :email_hash
fin

fin

59voto

stasl Points 655

Même les plus courts appel

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

44voto

EmFi Points 18645

ActiveRecord::Base.connexion vous fournira tout ce dont vous avez toujours voulu savoir sur la connexion de base de données établie par botte.rb et de l'environnement.rb

ActiveRecord::Base.connexion renvoie beaucoup d'informations. Vous devez donc vous savez exactement ce que vous cherchez.

Comme Marcel souligne:

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é s'appuyant sur des informations internes qui pourraient changer entre ActiveRecord version, je préfère le faire de cette façon:

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

28voto

KARASZI István Points 15162

Il y a un adapter_name en AbstractAdapter et qui est là depuis Rails2.

Il est donc plus facile à utiliser dans 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

8voto

ctide Points 2927

Dans Rails 3, (peut-être plus tôt, mais je suis à l'aide de Rails de 3 actuellement) à l'aide d'ActiveRecord::ConnectionAdapters::MysqlAdapter est une mauvaise façon de s'y prendre, il est initialisé si l'adaptateur de base de données utilisé est MySQL. Même si vous avez le gem MySQL installé, si ce n'est pas votre type de connexion, qui appellent à wil échouer:

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 vous recommande stasl de la réponse et de l'utilisation de la nom_carte propriété de la connexion.

-4voto

CodeJoust Points 2867

Cela peut vous aider:

execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X