2013-06-18 2 views
5

Я пытаюсь встать и работать с первичными ключами UUID для модели с Postgres и Rails 4.0 .0.rc2, но мои спецификации не могут создавать и уничтожать, но MyThing.create или MyThing#destroy отлично работает с консолью рельсов (как в тестовых, так и в тестовых средах). ... пока я не запустил спецификации, и в этом случае выполнение любой из этих операций перестает работать через консоль. Таким образом, это похоже на то, что происходит, когда я запускаю свои спецификации, которые меняют мою БД, и запрещает ключи UUID продолжать работать.RSpec, Rails 4, Postgres, первичные ключи UUID: id имеет значение null с Rake + RSpec, но это нормально в RSpec или консоли

Halp?

Я последовал this blog post генерировать свою миграцию, таким образом моя схема выглядит следующим образом:

ActiveRecord::Schema.define(version: 20130613174601) do 
    # These are extensions that must be enabled in order to support this database 
    enable_extension "plpgsql" 
    enable_extension "uuid-ossp" 

    create_table "growers", id: false, force: true do |t| 
    t.uuid  "id",   null: false 
    t.string "name" 
    t.string "code" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 
end 

Вот прогрессия вещей:

Создать: $ rake db:create RAILS_ENV=test

Migrate:

$ rake db:migrate RAILS_ENV=test 
== CreateGrowers: migrating ================================================== 
-- enable_extension("uuid-ossp") 
    -> 0.0052s 
-- create_table(:growers, {:id=>:uuid}) 
    -> 0.0043s 
== CreateGrowers: migrated (0.0096s) ========================================= 

Создатель е модель объекта:

$ rails c test 
agrian> g = Grower.create name: 'bobo' 
    (0.3ms) BEGIN 
    SQL (4.1ms) INSERT INTO "growers" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["created_at", Tue, 18 Jun 2013 20:22:39 UTC +00:00], ["name", "bobo"], ["updated_at", Tue, 18 Jun 2013 20:22:39 UTC +00:00]] 
    (0.4ms) COMMIT 
=> #<Grower id: "38f84f39-e52e-4664-b776-4fdfcbd60b09", name: "bobo", code: nil, created_at: "2013-06-18 20:22:39", updated_at: "2013-06-18 20:22:39"> 

(ликование)

Run характеристики:

$ rake spec 
/Users/sloveless/.rbenv/versions/2.0.0-p195/bin/ruby -S rspec ./spec/controllers/api/v1/growers_controller_spec.rb ./spec/helpers/growers_helper_spec.rb ./spec/models/grower_spec.rb ./spec/requests/api/v1/growers_spec.rb ./spec/routing/api/v1/growers_routing_spec.rb 
...............FF..........F.* 
(other stuff) 
Finished in 0.30626 seconds 
30 examples, 3 failures, 1 pending 

Создание модели объекта:

$ rails c test 
Loading test environment (Rails 4.0.0.rc2) 
agrian> g = Grower.create name: 'bobo' 
    (0.4ms) BEGIN 
    SQL (3.5ms) INSERT INTO "growers" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) [["created_at", Tue, 18 Jun 2013 20:29:36 UTC +00:00], ["name", "bobo"], ["updated_at", Tue, 18 Jun 2013 20:29:36 UTC +00:00]] 
PG::Error: ERROR: null value in column "id" violates not-null constraint 
DETAIL: Failing row contains (null, bobo, null, 2013-06-18 20:29:36.773391, 2013-06-18 20:29:36.773391). 
: INSERT INTO "growers" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) 
    (0.2ms) ROLLBACK 
ActiveRecord::StatementInvalid: PG::Error: ERROR: null value in column "id" violates not-null constraint 
DETAIL: Failing row contains (null, bobo, null, 2013-06-18 20:29:36.773391, 2013-06-18 20:29:36.773391). 
: INSERT INTO "growers" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) 
from /Users/sloveless/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/connection_adapters/postgresql_adapter.rb:780:in `get_last_result' 

(печальное лицо)

Может кто-то точка меня в правильном направлении здесь, что может делать глупые вещи с моим db?

Обновление: Я могу запустить bin/rspec spec снова и снова с успехом (все мои спецификации проходят). Если я запустил rake spec, я получаю сбои, затем в следующий раз, когда я запустил bin/rspec spec, я получаю сбои.

Редактировать: Обновлено название для отражения проблемы с rake + rspec, а не только с rspec.

ответ

4

Я вижу, что rspec-rails/lib/rspec/rails/tasks/rspec.rake определяет это для spec задачи:

spec_prereq = Rails.configuration.generators.options[:rails][:orm] == :active_record ? "test:prepare" : :noop 
task :noop do; end 
task :default => :spec 

# other stuff 

desc "Run all specs in spec directory (excluding plugin specs)" 
RSpec::Core::RakeTask.new(:spec => spec_prereq) 

...которая работает:

  • db:load_config
  • db:test:purge
  • db:test:load
  • db:test:load_schema
  • db:schema:load

Я вижу, что, когда работает rake db:schema:load, я получаю:

-- enable_extension("plpgsql") 
    -> 0.0161s 
-- enable_extension("uuid-ossp") 
    -> 0.0063s 
-- create_table("growers", {:id=>false, :force=>true}) 
    -> 0.0049s 
-- initialize_schema_migrations_table() 
    -> 0.0062s 

... который отличается при запуске миграции:

== CreateGrowers: migrating ================================================== 
-- enable_extension("uuid-ossp") 
    -> 0.0050s 
-- create_table(:growers, {:id=>:uuid}) 
    -> 0.0052s 
== CreateGrowers: migrated (0.0103s) ========================================= 

Таким образом, мне кажется, что db:schema:load задача не создает таблицу с UUID первичного ключа, тем самым вызывая неудачи. Кажется, ошибка Rails ??

Update: Я предполагаю, что я узнаю, если это Rails ошибка: Issue 11016

+2

Похоже, они будут фиксируя его в Rails 4.0.1. Они должны назвать релиз после вас. –

2

Для других, работающих в нечто подобное:

# config/application.rb 
config.active_record.schema_format :sql 

Для того, чтобы получить uuid_ossp расширение работу Postgres', Мне нужно было перейти на схему sql из schema.rb. Кажется, schema.rb пытается быть более нейтральным к базе данных, что, по понятным причинам, приводит к некоторой неудобства с пользовательскими расширениями db.

See vikks comment