@awendtは、私自身の質問に答えることができると親切に指摘しました。
レシピはかなり単純であることがわかりました。秘訣は、環境変数を使用して、使用するデータベースをRailsに通知することです。
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:テスト環境でのみ表示しています。実際、私が変更したのはこれだけです。これは、(おそらく)3つのデータベースすべてが適切にサポートされているかどうかを知るのに十分なカバレッジを提供するためです。
注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
でコードを調整できます。 。これが私の移行ファイルの1つからの例です:
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から適切なデータベースアダプタを設定します。幸いなことに、それはまさにテストコードが行うことです。したがって、たとえば、2つのウィンドウでrspecの自動テストを実行できます。
$ RAILS_DB=SQLite autotest
および
$ RAILS_DB=PostgreSQL autotest
これで、ファイルをハックして、何かが壊れた場合は自動テストで静かに警告が表示されます。