ruby-on-rails - Rails 水平分片在测试环境中未连接
问题描述
我在 Rails 应用程序中实现了简单的水平分片。有 2 个分片:主分片和存档分片。
应用程序在实际运行时在生产/开发/测试中工作,但是在运行测试套件时,永远不会连接到存档分片。
我在全局设置中设置了一个超级简单的测试test_helper.rb
来测试这个:
ActiveRecord::Base.connected_to(shard: :primary, role: :reader) do
p JobState.count
end
ActiveRecord::Base.connected_to(shard: :archive, role: :reader) do
p JobState.count
end
其中的输出是
2
No connection pool for 'ActiveRecord::Base' found for the 'archive' shard.
数据库存在,迁移成功运行。配置没有问题。
令人困惑的部分是运行实际的应用程序RAILS_ENV=test rails s
工作得很好,就像RAILS_ENV=test rails console
. 我可以毫无问题地运行确切的查询。
所以肯定有某种初始化没有为测试运行器运行,但我不知道它是什么。
我不认为这是应用程序配置的问题,但我也会在此处包括:
test:
primary:
<<: *default
url: <%= ENV['TEST_DATABASE_URL'] %>
archive:
<<: *default
url: <%= ENV['TEST_ARCHIVE_DATABASE_URL'] %>
class ApplicationRecord < RxModule::ApplicationRecord
self.abstract_class = true
connects_to shards: {
primary: { writer: :primary, reader: :primary },
archive: { writer: :archive, reader: :archive }
}
end
有人对这里有任何见解吗?
解决方案
我最终找到了解决方案,但我觉得我留下的问题多于答案。
问题是:reader
我:writer
在.connects_to
ApplicationRecord
Rails 期望这些/默认值是:reading
, 和:writing
. 更改connect_to
语句以及connected_to
整个应用程序中的任何语句都解决了整个问题,尽管我不知道为什么它在更改之前在所有其他上下文中都有效。
推荐阅读
- angular - Angular 6:将订阅数据分配给局部变量以进行进一步处理
- c# - 如何在 Outlook 插件中访问 EWS `UniqueId` 字段
- javascript - 在同一页面中创建多个图表时出现问题
- assembly - 我的 x86 8086 的 ASM 程序打印不好
- php - 从数据库中获取数据并使用php将其显示在表中
- javascript - 在没有 JavaScript 上传的情况下显示文件上传进度
- javascript - 如何将平面数据结构转换为树状结构?
- html - 如何改变1个句子的颜色
标签而不添加新行?
- php - 如何将字符串中的两个字符视为一个字节?
- javascript - 如果容器有某个类的孩子