Sha*_*n F 43 ruby migration ruby-on-rails rails-migrations
我有以下迁移,我希望能够检查与环境相关的当前数据库是否是一个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
小智 57
更短的电话
ActiveRecord::Base.connection.adapter_name == 'MySQL'
Run Code Online (Sandbox Code Playgroud)
EmF*_*mFi 40
ActiveRecord::Base.connection将为您提供有关由boot.rb和建立的数据库连接的所有信息environment.rb
ActiveRecord::Base.connection返回了很多信息.所以你必须确切地知道你在寻找什么.
正如马塞尔指出:
ActiveRecord::Base.connection.instance_of?
ActiveRecord::ConnectionAdapters::MysqlAdapter
Run Code Online (Sandbox Code Playgroud)
可能是确定您的数据库MySQL的最佳方法.
尽管依赖于可能在ActiveRecord发布之间发生变化的内部信息,我更喜欢这样做:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
Run Code Online (Sandbox Code Playgroud)
KAR*_*ván 26
自Rails2以来就有一个adapter_namein AbstractAdapter和那里.
因此,在迁移中使用更容易,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在Rails 3中,(可能更早,但我目前正在使用Rails 3)使用ActiveRecord :: ConnectionAdapters :: MysqlAdapter是一种很糟糕的方式,因为只有在使用的数据库适配器是MySQL时才会初始化它.即使您安装了MySQL gem,如果它不是您的连接类型,那么该调用将失败:
Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1
Run Code Online (Sandbox Code Playgroud)
所以,我建议使用stasl的答案并使用连接的adapter_name属性.
| 归档时间: |
|
| 查看次数: |
15197 次 |
| 最近记录: |