3

いくつかのテーブルで MyISAM を使用する必要があるアプリケーションがありますが、残りは従来の InnoDB タイプです。アプリケーション自体は、これらのレコードに適用されるトランザクションには関係ありませんが、パフォーマンスが懸念されます。

ただし、Rails テスト環境では、使用されるエンジンがトランザクション対応であることを想定しているため、テスト データベースが schema.rb から生成されると、同じエンジンでインポートされます。この動作を簡単な方法でオーバーライドすることは可能ですか?

これをtest_helper.rbに追加することで、テーブルが正しいタイプであることを確認するために、私はひどいハックに頼りました:

(ActiveRecord::Base.connection.select_values("SHOW TABLES") - %w[ schema_info ]).each do |table_name|
  ActiveRecord::Base.connection.execute("ALTER TABLE `#{table_name}` ENGINE=InnoDB")
end

MyISAM に裏打ちされたモデルをテスト可能にするより良い方法はありますか?

4

4 に答える 4

4

schema.rb を編集し、create_table 呼び出しを変更して、次のようにフラグを含めることができます。

create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

移行を作成するときは、それを移行に追加してみてください。rake db:schema:dump を実行したときにこれが続くかどうかはわかりません。テスト環境が開発環境を適切にコピーしていないように見えるという経験を考えると、そうではないかもしれません:(

create_table オプションの詳細については、こちらをご覧ください:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001901

于 2010-04-14T09:03:57.977 に答える
2

設定できます

self.use_transactional_fixtures = false

test_helper.rb で

于 2010-04-23T10:29:18.117 に答える
2

これを次の場所に追加できますapplication.rb:

config.active_record.schema_format = :sql

これで test db は command に問題がなくなりrake db:test:prepareます。移行ファイルでは、テーブルを再作成する代わりに (既存の InnoDB テーブルを MyISAM に変更する必要がある場合)、これをupメソッドに追加するだけです:

execute("ALTER TABLE your_table ENGINE=MyISAM")
于 2013-06-04T07:01:19.613 に答える
1

この SchemaDumper monkeypatch を追加して、エンジンを schema.rb に明示的に追加できます。

https://gist.github.com/1374003

これは Rails 2.3.14 からモンキーパッチが適用されているため、Rails 3 では保証されません。

于 2011-11-17T18:28:56.840 に答える