@awendt любезно посочи, че мога да отговоря сам на въпроса си.
Оказва се, че рецептата е доста проста. Тайната е да използвате променлива на средата, за да кажете на Rails кой db искате да използвате.
1. Промяна на вашите файлове
В config/database.yml
, включва ERB конструкции като тази:
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 %>
Забележка 1:Показах го само за тестовата среда. Всъщност това е единствената, която промених, тъй като (предполага се) осигурява достатъчно покритие, за да ми каже дали и трите бази данни се поддържат правилно.
Забележка 2:Не е необходимо да използвате променливи на средата, за да зададете потребителско име и парола – това е нещо, което предпочитам да правя, тъй като избягва разкриването на пароли в често разглеждан файл.
По същия начин разширете Gemfile, както следва (обърнете внимание, че номерата на версиите ви могат да варират):
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. Добавете условия към вашия код
Въпреки най-добрите усилия на екипа за разработка на Rails, има няколко места, където конструкциите на ActiveRecord не са съвместими във всички варианти на база данни. В тези случаи можете да определите кода си с ActiveRecord::Base.connection.adapter_name
. Ето пример от един от моите миграционни файлове:
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. Тестване и тестване
Вече можете да изберете база данни, просто като зададете променливата на средата RAILS_DB, но има уловка:трябва да изпълните bundle install
всеки път, за да настроите подходящия адаптер на база данни от Gemfile. За щастие, точно това прави тестовият код. Така например мога да стартирам автотеста на rspec в два прозореца:
$ RAILS_DB=SQLite autotest
и
$ RAILS_DB=PostgreSQL autotest
Сега мога да хакна файловете си и автоматичното тестване тихо ще ме предупреди, ако съм счупил нещо, докато вървя.