我有一些奇怪的问题(对于一个非常奇怪的用例,我会解释)。我正在使用postgres模式设置多租户应用程序以实现数据多租户。
我系统中的每个company
都会获得自己的架构。我完成此操作的方法是在模型上使用after_commit
,在创建时,然后创建一个新的postgres模式,并将schema.rb
加载到其中。 (使用ruby rake db:schema:load
从load
代码复制)。
您可以看到gem here
无论如何,这一切都有效(在控制台中)。创建公司创建新架构,我可以切换到它等...我的问题在于我的集成测试。我有一个像这样的公司创建的rspec测试:
before do
@c1 = Factory :company
@c2 = Factory :company
end
奇怪的是,我开始获取有关db模式加载的日志,但它们被截断了。几乎就好像它们并行发生一样。这是一个示例输出:
>> create: database: unique_name1
-- create_table("first_table_in_schema_rb", {:force=>true})
>> create: database: unique_name2
create: database
是我的日志行,-- create_table
来自schema.rb
本身。
正如您所看到的,第二次create: database
似乎是在我从第一次创建公司时加载schema.rb
时发生的。
有人知道load
是否异步?我知道红宝石没有真正的线程,但它可能是使用纤维或其他东西?这真让我烦恼,因为当我的测试出现时,想要创建的postgres架构似乎不存在。
Rails 3.0.8
Ruby 1.9.2
答案 0 :(得分:0)
我不是100%确定这是你的问题因为我确定require
会发生什么,而不是load
会发生什么事情,这种情况发生在我身上,因为需要不是原子的,所以加载带有require的文件中的代码会导致竞争条件。也许这就是正在发生的负载,但我无法找到任何有关负载的信息是否原子。
答案 1 :(得分:0)
nevermind ...问题与load
无关在导入wrong schema
schema.rb
相关联
实际上有一个被抛出的异常被隐藏在某个地方