Railsアプリを開発する際に、レガシーなDBを扱う場合を考えます。
この場合のアプリケーションはDBのスキーマ情報を定義しないため、RSpecを導入してrake specを実行した場合、
schema.rbが空であるため、db系のrakeタスクが動かずに、エラーとなります。
これを回避するために、db系のrakeタスクをアプリケーションで上書きして、
何もしないタスクに置き換えることができます。
アプリケーション定義Rakeタスクファイルとして、
{Rails.root}/lib/tasks/db.rakeを作成し、次のように実装します。
module Rake::TaskManager def remove_task(task_name) @tasks.delete(task_name.to_s) end end Rake.application.remove_task "db:create" Rake.application.remove_task "db:drop" Rake.application.remove_task "db:fixtures:load" Rake.application.remove_task "db:migrate" Rake.application.remove_task "db:migrate:status" Rake.application.remove_task "db:rollback" Rake.application.remove_task "db:schema:dump" Rake.application.remove_task "db:schema:load" Rake.application.remove_task "db:seed" Rake.application.remove_task "db:setup" Rake.application.remove_task "db:structure:dump" Rake.application.remove_task "db:test:prepare" namespace :db do desc "do nothing." task :create => :environment do puts "This task does nothing." end : 以下、全てのタスクを空に。 endrake -Tを実行すると、db系タスクが上書きできていることが確認できます。 これで、レガシーDBを扱うアプリケーションでも、DBを変更する危険もなく、 RSpecもスムーズに実行することができます。
0 件のコメント:
コメントを投稿