【发布时间】:2011-10-25 19:43:40
【问题描述】:
短版
类变量在控制器操作期间是线程安全的吗?
加长版
我正在编写一个 Rails 3 应用程序,该应用程序使用单个数据库模式实现多租户,每个表中都有 tenant_id 列,以识别数据属于谁。
当然,我需要一种方法来确定在数据库上运行的所有查询的范围,以确保每个租户对数据的访问都是正确的。
一些人建议通过始终通过tenant 实例访问数据库来实现此目的,例如:
current_tenant.associate_collection.where(...)
等等
但是,由于多租户是一个架构问题(而不是业务领域问题),我希望通过在全局范围内设置它来尽可能保持模型对模型透明。它也很干燥。
我发现我可以使用 multitenant gem 和 around_filters 做到这一点:
class ApplicationController
around_filter do
Multitenant.with_tenant current_tenant
yield
end
end
end
这会操纵适当模型的default_scope,以便所有数据访问都自动限定在当前租户范围内。
这在开发中效果很好,但我担心线程安全。 Multitenant.with_tenant 将 current_tenant 引用保留在类变量中。
问题是当控制器操作在堆栈上时,我可以依赖该变量的完整性吗?或者它是否会被另一个请求破坏?
另外,关于 Rails 中的一般并发问题,有什么好的资料来源?
【问题讨论】:
标签: ruby-on-rails-3 concurrency thread-safety multi-tenant scopes