Rails: лучшая практика для охвата запросов на основе поддоменов?

Я работаю над приложением 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 для сброса диапазона моделей по умолчанию для каждого запроса. Не уверен насчет производительности здесь или как лучше выбрать, какие модели обновлять по запросу.

Мысли? Любые другие решения, которые я пропускаю? Казалось бы, это достаточно распространенная проблема, так что должна быть лучшая практика. Все отзывы приветствуются, спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос