Rails: ¿la mejor práctica para abarcar consultas basadas en subdominios?

Estoy trabajando en una aplicación Rails (actualmente 2.3.4) que utiliza subdominios para aislar sitios de cuentas independientes. Para que quede claro, lo que quiero decir es que foo.mysite.com debería mostrar el contenido de la cuenta foo y bar.mysite.com debería mostrar el contenido de la barra.

¿Cuál es la mejor manera de asegurarse de que todas las consultas del modelo estén sujetas al subdominio actual?

Por ejemplo, uno de mis controladores se ve algo así como:

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

(Nota@global_organization se establece en el application_controller a través de subdominio-fu.) Cuando lo que preferiría es algo como:

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

donde los hallazgos del modelo de página se incluyen automáticamente en el ámbito de la organización correcta. He intentado usar la directiva default_scope de esta manera: (en el modelo de página)

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

(De nuevo, solo para tener en cuenta, el mismo controlador de aplicación establece Thread.current [: organización] en la identificación de la organización para el acceso global.) El problema con este enfoque es que el alcance predeterminado se establece en la primera solicitud y nunca cambia en las solicitudes subsiguientes. Diferentes subdominios.

Tres soluciones aparentes hasta el momento:

1 Use vhosts separados para cada subdominio y simplemente ejecute instancias diferentes de la aplicación por subdominio (usando mod_rails). Este enfoque no es escalable para esta aplicación.

2 Utilice el enfoque del controlador original anterior. Desafortunadamente, hay bastantes modelos en la aplicación y muchos de ellos son algunas combinaciones eliminadas de la organización, por lo que esta notación se vuelve engorroso rápidamente. Lo peor es que esto requiere activamente que los desarrolladores recuerden y apliquen la limitación o el riesgo de un problema de seguridad importante.

3 Use un before_filter para restablecer el alcance predeterminado de los modelos en cada solicitud. No estoy seguro sobre el impacto en el rendimiento aquí o la mejor manera de seleccionar qué modelos actualizar por cada requerimiento.

¿Pensamientos? ¿Alguna otra solución que me falta? Esto parece ser un problema lo suficientemente común como para que haya una mejor práctica. Todos los comentarios apreciados, gracias!

Respuestas a la pregunta(5)

Su respuesta a la pregunta