Frage

Ich habe die folgende Migration und ich mag überprüfen können, ob die aktuelle Datenbank mit der Umwelt eine MySQL-Datenbank ist. Wenn es mysql ist dann möchte ich die SQL auszuführen, die auf die Datenbank spezifisch ist.

Wie kann ich über diese gehen?

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
War es hilfreich?

Lösung

ActiveRecord::Base.connection werden Sie mit allem, was Sie jemals über die Datenbankverbindung hergestellt von boot.rb und environment.rb

wissen wollten

ActiveRecord::Base.connection gibt eine Menge Informationen. Also man muss genau wissen, was Sie suchen.

Wie Marcel betont:

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

ist wahrscheinlich die beste Methode, wenn Ihre Datenbank MySQL zu bestimmen.

auf interne Informationen Trotz verlassen, die zwischen ActiveRecord Release ändern könnten, ziehe ich es auf diese Weise tun:

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

Andere Tipps

Noch kürzer Anruf

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

Es gibt eine adapter_name in AbstractAdapter und das ist es, da Rails2

So ist es einfacher, in der Migration wie folgt zu verwenden:

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, (vielleicht früher, aber ich bin mit Rails 3 zur Zeit) unter Verwendung von Active :: ConnectionAdapters :: MysqlAdapter ist ein schlechter Weg, um darüber zu gehen, da es nur, wenn die Datenbank-Adapter in Gebrauch initialisiert ist, ist MySQL. Auch wenn Sie das MySQL-Juwel installiert haben, wenn es nicht Ihre Verbindungsart ist, wil, dass Anruf fehlschlagen:

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

Also, ich würde die Stasi Antwort und verwenden Sie die adapter_name Eigenschaft der Verbindung empfehlen.

Dies könnte helfen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top