@awendt dengan ramah menunjukkan bahwa saya dapat menjawab pertanyaan saya sendiri.
Ternyata resepnya cukup sederhana. Rahasianya adalah menggunakan variabel lingkungan untuk memberi tahu Rails db mana yang ingin Anda gunakan.
1. Memodifikasi file Anda
Di config/database.yml
, sertakan konstruksi ERB seperti ini:
test:
<% if (ENV["RAILS_DB"] == "PostgreSQL") %>
adapter: postgresql
encoding: unicode
database: bd_test
pool: 5
username: <%= ENV['POSTGRESQL_USERNAME'] || 'root' %>
password: <%= ENV['POSTGRESQL_PASSWORD'] || '' %>
<% elsif (ENV["RAILS_DB"] == "MySQL") %>
adapter: mysql
encoding: utf8
reconnect: false
database: bd_test
pool: 5
username: <%= ENV['MYSQL_USERNAME'] || 'root' %>
password: <%= ENV['MYSQL_PASSWORD'] || '' %>
socket: <%= ENV['MYSQL_SOCKET'] || '/tmp/mysql.sock' %>
<% else %>
# default to SQLite
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
<% end %>
Catatan 1:Saya hanya menunjukkannya untuk lingkungan pengujian. Faktanya, itulah satu-satunya yang telah saya modifikasi, karena (seharusnya) menyediakan cakupan yang cukup untuk memberi tahu saya apakah ketiga database didukung dengan benar.
Catatan 2:Anda tidak perlu menggunakan variabel lingkungan untuk menyetel nama pengguna dan sandi -- itu hanya sesuatu yang saya lebih suka lakukan karena menghindari membuka sandi dalam file yang biasa dilihat.
Demikian pula, perluas Gemfile sebagai berikut (perhatikan bahwa nomor versi Anda mungkin berbeda):
source 'http://rubygems.org'
gem 'rails', '3.0.3'
case ENV["RAILS_DB"]
when "PostgreSQL"
gem 'pg', '0.10.0'
when "MySQL"
gem 'mysql2'
else
gem 'sqlite3', '1.3.3'
gem 'sqlite3-ruby', '1.3.3', :require => 'sqlite3'
end
...
2. Tambahkan ketentuan ke kode Anda
Terlepas dari upaya terbaik dari tim pengembangan Rails, ada beberapa titik di mana konstruksi ActiveRecord tidak kompatibel di semua jenis database. Dalam kasus ini, Anda dapat mengkondisikan kode Anda di ActiveRecord::Base.connection.adapter_name
. Berikut ini contoh dari salah satu file migrasi saya:
file: migrate/20110129023453_create_cached_web_pages.rb
def self.up
create_table :cached_web_pages do |t|
t.string :key
if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
t.binary :value
else
t.binary :value, :limit => 16777215
end
end
end
...
3. Menjalankan dan menguji
Anda sekarang dapat memilih database hanya dengan menyetel variabel lingkungan RAILS_DB, tetapi ada masalah:Anda harus menjalankan bundle install
setiap kali mengatur adaptor database yang sesuai dari Gemfile. Untungnya, itulah tepatnya yang dilakukan oleh kode pengujian. Jadi, misalnya, saya dapat menjalankan autotest rspec di dua jendela:
$ RAILS_DB=SQLite autotest
dan
$ RAILS_DB=PostgreSQL autotest
Sekarang saya dapat meretas file saya dan autotest diam-diam akan memperingatkan saya jika saya telah merusak sesuatu saat saya melanjutkan.