Я работаю над приложением Rails (в настоящее время 2.3.4), которое использует субдомены для изоляции сайтов независимых учетных записей. Чтобы было ясно, я имею в виду, что foo.mysite.com должен отображать содержимое учетной записи foo, а bar.mysite.com должен отображать содержимое бара.
Каков наилучший способ обеспечения того, чтобы все запросы модели были привязаны к текущему поддомену?
Например, один из моих контроллеров выглядит примерно так:
@page = @global_organization.pages.find_by_id(params[:id])
(Примечание @global_organization
устанавливается в application_controller через subdomain-fu.)
Когда то, что я бы предпочел, это что-то вроде:
@page = Page.find_by_id(params[:id])
, где находки модели страницы автоматически попадают в нужную организацию. Я попытался использовать директиву default_scope, как это: (в модели страницы)
class Page < ActiveRecord::Base
default_scope :conditions => "organization_id = #{Thread.current[:organization]}"
# yadda yadda
end
(Опять же, просто чтобы заметить, тот же application_controller устанавливает Thread.current [: organization] для идентификатора организации для глобального доступа.) Проблема этого подхода заключается в том, что область действия по умолчанию устанавливается в первом запросе и никогда не изменяется последующие запросы к разным поддоменам.
Три очевидных решения на данный момент:
1 Используйте отдельные vhosts для каждого субдомена и просто запускайте разные экземпляры приложения для каждого субдомена (используя mod_rails). Этот подход не масштабируется для этого приложения.
2 Используйте оригинальный подход контроллера выше. К сожалению, в приложении довольно много моделей, и многие из этих моделей - это несколько удаленных из организации соединений, поэтому такая запись быстро становится громоздкой. Хуже всего то, что для этого активно требуется, чтобы разработчики помнили и применили ограничение или рискнули серьезной проблемой безопасности.
3 Используйте before_filter для сброса диапазона моделей по умолчанию для каждого запроса. Не уверен насчет производительности здесь или как лучше выбрать, какие модели обновлять по запросу.
Мысли? Любые другие решения, которые я пропускаю? Казалось бы, это достаточно распространенная проблема, так что должна быть лучшая практика. Все отзывы приветствуются, спасибо!