Я работаю через mutli-tenancy tut, используя схемы postgres.Rails: Очистка схем postgres в базе данных тестов
Схемы для каждого арендатора в тестовой базе данных должны быть очищены после каждого запуска для правильной работы тестов.
RSpec производит следующие ошибки
An error occurred in an after hook
PG::Error: ERROR: syntax error at or near "where"
LINE 5: where nspowner != (select oid from pg_roles where role...
1) account scoping displays only account A's records
Failure/Error: let!(:account_a) { FactoryGirl.create(:account_with_schema) }
Apartment::SchemaExists:
The schema test1 already exists.
# ./app/models/subscribem/account.rb:20:in `create_schema'
# ./spec/support/factories/account_factory.rb:11:in `block (4 levels) in <top (required)>'
# ./spec/features/accounts/scoping_spec.rb:4:in `block (2 levels) in <top (required)>'
Это код пытается очистить базу данных после каждого теста.
spec_helper.rb
config.after(:each) do
Apartment::Database.reset
DatabaseCleaner.clean
connection = ActiveRecord::Base.connection.raw_connection
schema = connection.query(%Q{
SELECT 'drop schema ' || nspname || ' cascade;'
from pg_namespace
where nspname != 'public' AND
where nspowner != (select oid from pg_roles where rolname = 'postgres');
})
schemas.each do |query|
connection.query(query.values.first)
end
end
Тем не менее производит ту же ошибку, произошла ошибка в после крюком PG :: Error: ERROR: ошибка синтаксиса в или вблизи "где" ЛИНИЯ 5: где nspowner NOT IN (выберите oid из pg_roles, где ... –
Похоже, что у него все еще есть два предложения WHERE, строка 5, упомянутая в ошибке, должна быть 'nspowner NOT IN ...' not 'где nspowner NOT IN'. – Steve