Короткая версия
Являются ли переменные класса поточно-ориентированными на время действия контроллера?
Длинная версия
Я пишу приложение на Rails 3, которое реализует мультитенантность с использованием единой схемы базы данных со столбцами tenant_id
в каждой таблице, чтобы определить, кому принадлежат данные.
Естественно, мне нужен способ охвата всех запросов, которые выполняются в базе данных, чтобы гарантировать, что доступ к данным должным образом изолирован для каждого владельца.
Несколько человек предложили добиться этого, всегда обращаясь к базе данных через экземпляр tenant
, например ::
current_tenant.associate_collection.where(...)
и т.д.
Однако, поскольку многопользовательская аренда является архитектурной задачей (а не бизнес-сферой), я бы предпочел сохранить ее максимально прозрачной для модели, настроив ее глобально. Это также намного суше.
Я обнаружил, что могу сделать это, используя мультитенантный гем и вокруг_фильтров:
class ApplicationController
around_filter do
Multitenant.with_tenant current_tenant
yield
end
end
end
Управляет default_scope
соответствующих моделей, так что весь доступ к данным автоматически ограничивается текущим арендатором.
Это прекрасно работает при разработке, но у меня есть опасения по поводу безопасности потоков. Multitenant.with_tenant
сохраняет ссылку current_tenant
в переменной класса.
Вопрос в том, могу ли я рассчитывать на целостность этой переменной, пока действие контроллера находится в стеке? или она может быть повреждена другим запросом?
Кроме того, каков хороший источник общих проблем параллелизма в Rails?