0

私は「RubyとRailsを使ったサービス指向の設計」という本と一緒に仕事をしています。最初の章では、アクティブレコードを使用してSinatraアプリケーションでサービスを作成します。アクティブレコードの移行(001_create_users.rb、以下を参照)を作成し、rakeファイルを実行して移行しました(コマンドを使用rake db:migrate)。これにより、usersテーブルが作成されたことを示すように見える出力が得られました(この投稿の下部を参照) rake db:migrateを実行した後の出力用)。ただし、仕様を実行すると(rspec spec/service_spec.rb、以下を参照)、usersテーブルが見つからないというエラーが表示されました。

table_structure': Could not find table 'users' (ActiveRecord::StatementInvalid)

私が間違っているかもしれないことを教えてもらえますか?この本の最初の章のソースコードは、https://github.com/pauldix/service-oriented-design-with-ruby/tree/master/chapter_01にもあります。

spec / service_spec.rb

RSpec.configure do |conf|
  conf.include Rack::Test::Methods
end

def app
  Sinatra::Application
end

describe "service" do
  before(:each) do
    User.delete_all
  end

  describe "GET on /api/v1/users/:id" do
    before(:each) do
      User.create(
        :name => "paul",
        :email => "paul@pauldix.net",
        :password => "strongpass",
        :bio => "rubyist")
    end

    it "should return a user by name" do
      get '/api/v1/users/paul'
      last_response.should be_ok
      attributes = JSON.parse(last_response.body)["user"]
      attributes["name"].should == "paul"
    end

/db/migrate/001_create_users.rb

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :email
      t.string :password
      t.string :bio

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Rakefile

require 'rubygems'
require 'active_record'
require 'yaml'
require 'logger'

desc "Load the environment"
task :environment do
  env = ENV["SINATRA_ENV"] || "development"
  databases = YAML.load_file("config/database.yml")
  ActiveRecord::Base.establish_connection(databases[env])
end

namespace :db do
  desc "Migrate the database"
  task(:migrate => :environment) do
    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Migration.verbose = true
    ActiveRecord::Migrator.migrate("db/migrate")
  end
end

rake db:migrateを実行した後

D, [2013-03-08T20:11:55.490937 #3824] DEBUG -- :    (0.2ms)  select sqlite_version(*)
D, [2013-03-08T20:11:55.493906 #3824] DEBUG -- :    (2.1ms)  CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL) 
D, [2013-03-08T20:11:55.497176 #3824] DEBUG -- :    (2.6ms)  CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
D, [2013-03-08T20:11:55.544128 #3824] DEBUG -- :    (44.9ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" 
I, [2013-03-08T20:11:55.544615 #3824]  INFO -- : Migrating to CreateUsers (1)
D, [2013-03-08T20:11:55.545263 #3824] DEBUG -- :    (0.1ms)  begin transaction
==  CreateUsers: migrating ====================================================
-- create_table(:users)
D, [2013-03-08T20:11:55.570509 #3824] DEBUG -- :    (0.6ms)  CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "email" varchar(255), "password" varchar(255), "bio" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) 
   -> 0.0018s
==  CreateUsers: migrated (0.0019s) ===========================================

D, [2013-03-08T20:11:55.571113 #3824] DEBUG -- :    (0.1ms)  INSERT INTO "schema_migrations" ("version") VALUES ('1')
D, [2013-03-08T20:11:55.576187 #3824] DEBUG -- :    (4.8ms)  commit transaction
michael$ rspec spec/service_spec.rb
D, [2013-03-08T20:12:57.812685 #3854] DEBUG -- : env: test
D, [2013-03-08T20:12:57.910829 #3854] DEBUG -- : db/test.sqlite3 database connection established...
4

1 に答える 1

0

migrateタスクは、環境をデフォルトで「開発」に設定する前提条件として呼び出します。environmentただし、ENV変数が他のことを言っている場合を除きます。

何が起こるかというと、開発DBは移行されますが、テストDBは移行されません。

あなたの本の指示のように、少し後に、電話してください

rake db:migrate SINATRA_ENV=test

そして、移行されるのはテストDBになります。

于 2013-03-09T05:18:56.487 に答える