Rails: melhor prática para escopo de consultas com base no subdomínio?

Eu estou trabalhando em um aplicativo Rails (atualmente 2.3.4) que faz uso de subdomínios para isolar sites de contas independentes. Para ser claro, o que quero dizer é que foo.mysite.com deve mostrar a conta foo 'content e bar.mysite.com deve mostrar o conteúdo da barra.

Qual é a melhor maneira de garantir que todas as consultas de modelo tenham escopo para o subdomínio atual?

Por exemplo, um dos meus controladores é algo como:

@page = @global_organization.pages.find_by_id(params[:id])        

(Nota@global_organization é definido no application_controller via subdomain-fu. Quando o que eu preferir é algo como:

@page = Page.find_by_id(params[:id])

onde o modelo de página encontra automaticamente o escopo para a organização correta. Eu tentei usar a diretiva default_scope assim: (no modelo Page)

class Page < ActiveRecord::Base
  default_scope :conditions => "organization_id = #{Thread.current[:organization]}"
  # yadda yadda
end

(Novamente, apenas para observar, o mesmo application_controller define Thread.current [: organization] como o ID da organização para acesso global.) O problema com essa abordagem é que o escopo padrão é definido na primeira solicitação e nunca é alterado nas solicitações subseqüentes. subdomínios diferentes.

Três soluções aparentes até agora:

1 Use vhosts separados para cada subdomínio e apenas execute instâncias diferentes do aplicativo por subdomínio (usando mod_rails). Esta abordagem não é escalável para este aplicativo.

2 Use a abordagem do controlador original acima. Infelizmente, há um grande número de modelos no aplicativo e muitos dos modelos são alguns membros removidos da organização, portanto, essa notação rapidamente se torna incômoda. O pior é que isso exige ativamente que os desenvolvedores se lembrem e apliquem a limitação ou arrisquem um problema de segurança significativo.

3 Use um before_filter para redefinir o escopo padrão dos modelos em cada solicitação. Não tenho certeza sobre o desempenho atingido aqui ou qual a melhor forma de selecionar quais modelos atualizar por solicitação.

Pensamentos? Alguma outra solução que estou perdendo? Isso parece ser um problema comum o suficiente para que haja uma prática recomendada. Todas as entradas apreciadas, obrigado!

questionAnswers(5)

yourAnswerToTheQuestion