私は持ってgem devise
いgem apartment
て、各デバイスのユーザーアカウント用に個別のスキーマを作成するために使用しています。
その号のアパートのドキュメントとアドバイスでは、 Rack ミドルウェアを使用してテナントを切り替えることを提案しています。その場合、リクエストに依存するのではなくユーザーに依存するため、(私が知る限り)不可能です。
私のRSpecテストを除いて、すべてうまくいきます。問題は、すべてのテスト データベースが適切にクリーンアップされていないことです (新しく作成されたユーザーのスキーマが削除されません)。少数のテストを実行するとすべてのテストに合格しますが、多くのテストを実行するとFaker::Internet.first_name
、既に使用されているユーザー名が生成されます (これは有効ではありません)。
これが私がやった方法です:
アプリ/コントローラー/application_controller.rb
def scope_tenant
Apartment::Database.switch(current_user.username)
end
app/controllers/albums_controller.rb (アルバムモデルbelong_to :user
)
class AlbumsController < ApplicationController
before_action :authenticate_user! # devise magic
before_action :scope_tenant
アプリ/モデル/user.rb
after_create :create_schema
private
def create_schema
Apartment::Database.create(self.username)
end
これは私が仕様に追加したものです:
仕様/工場/user.rb
FactoryGirl.define do
factory :user do
username { Faker::Name.first_name }
email { Faker::Internet.email("#{username}") }
password "login_as will not use it anyway"
end
end
仕様/サポート/auth_helpers.rb
Warden.test_mode!
def login_and_switch_schema(user)
login_as(user)
Apartment::Database.switch(user.username) # for some reason `login_as()` didn't do that by itself
end
仕様/機能/アルバム_spec.rb
feature "Album Pages" do
given(:user) { create(:user) }
given(:album) { create(:album) }
around :each do
login_and_switch_schema user
end
scenario...
私はそれよりもいくつかのテストをjs: true
持っているので:
仕様/サポート/database_cleaner.rb
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
すべてのソースの現在のコミットは、こちらの github で入手できます。
だから..主な質問は、テスト後に各ユーザーのデータベースで作成されたスキーマをきれいにする方法ですか? 他のコメントもよろしくお願いします。よろしくお願いします。