2011-03-15 12 views
2

私は最新のRoRアプリケーションをHerokuに配備し始めました。私はこれまで、PostgreSQLの使用を開始する必要がありました。以前はSQLiteとMySQLを使用していました。私は3つのデータベースすべてに対して継続的に赤/緑のテストを行い、開発の熱中で何も壊していないことを確かめるために死んで簡単な方法を望んでいました。RoR:複数のデータベースに対してアプリをテストするにはどうすればよいですか?

どうすればよいですか?

+1

質問がありますか? –

+1

それは答えでの質問です(これはfaqによると正当です)。私は他の人が役に立つと思っていたと思った。 –

+1

いいえ、質問部分に質問+回答です。下記のあなた自身の質問に答えてください(あなたの答え)、その答えを受け入れてください。そうすれば、これは未応答のキューから移動します。ありがとう! – awendt

答えて

0

@awendtが私自身の質問に答えることができたことを親切に指摘しました。

レシピはかなり単純です。秘密は、環境変数を使用して、どのデータベースを使用するかをRailsに伝えることです。

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:私はテスト環境のためにそれを示してきた

1.変更するファイルconfig/database.yml

は、ERBは次のように構築しています。実際には、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から例です:あなたは今RAILS_DB環境変数を設定することで、データベースを簡単に選択することができます

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.実行とテストは、しかし、キャッチがあります: Gemfileから適切なデータベースアダプタを設定するたびにbundle installを実行する必要があります。幸いにも、それはまさにテストコードがすることです。ですから、例えば、私は2つのウィンドウにRSpecのの自動テストを実行することができます。

$ RAILS_DB=SQLite autotest 

$ RAILS_DB=PostgreSQL autotest 

今、私は私のファイルや自動テストで離れてハックすることができ、私のように何かを破損してしまった場合、静かに私を警告します私は一緒に行く。

関連する問題