문제

다음 마이그레이션이 있으며 환경과 관련된 현재 데이터베이스가 MySQL 데이터베이스인지 확인하고 싶습니다. MySQL이라면 데이터베이스에 특정한 SQL을 실행하고 싶습니다.

이것에 대해 어떻게 가나 요?

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
도움이 되었습니까?

해결책

ActiveRecord::Base.connection 설정 한 데이터베이스 연결에 대해 알고 싶은 모든 것을 제공합니다. boot.rb 그리고 environment.rb

ActiveRecord::Base.connection 많은 정보를 반환합니다. 그래서 당신은 당신이 찾고있는 것을 정확히 알아야합니다.

Marcel이 지적한 것처럼 :

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

데이터베이스 MySQL인지 결정하는 가장 좋은 방법 일 것입니다.

사이에 변경 될 수있는 내부 정보에 의존 함에도 불구하고 ActiveRecord 릴리스, 나는이 방법을 선호합니다.

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

다른 팁

더 짧은 전화

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

있습니다 adapter_name 안에 AbstractAdapter 그리고 그것은 Rails2 이후입니다.

따라서 다음과 같은 마이그레이션에서 사용하기가 더 쉽습니다.

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

Rails 3, (아마도 이전에 Rails 3을 사용하고 있지만) ActiveRecord :: ConnectionAdapters :: MySQladapter를 사용하여 사용중인 데이터베이스 어댑터가 MySQL이기 때문에 초기화되므로 진행할 수있는 방법이 좋지 않습니다. MySQL Gem이 설치되어 있더라도 연결 유형이 아닌 경우 WIL 실패를 호출하십시오.

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

따라서 STASL의 답변을 권장하고 연결의 adapter_name 속성을 사용합니다.

도움이 될 수 있습니다 :

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top