Rails ‘includes () no funciona con condiciones de asociación dinámicas

Trabajando en una aplicación de varios inquilinos donde la mayoría de mis modelos tendrán un campo tenant_id para que pueda garantizar los permisos de lectura mediante la asociación ( current_tenant.applications.find(params[:id]) ):

 class Application  proc {{:tenant_id => tenant_id}}, :dependent => :destroy end 

Me gusta cómo esto me permite crear de forma elegante una nueva AppQuestion con el conjunto tenant_id automáticamente:

 @application = current_tenant.applications.find(params[:app_question][:application_id]) @question = @application.app_questions.build(params[:app_question]) #... 

El problema es que cuando bash usar includes() para cargar la asociación, produce un error:

 current_tenant.applications.where(:id => params[:id]).includes(:app_questions => :app_choices).first NoMethodError (undefined method `tenant_id' for #): app/models/application.rb:7:in `block in ' 

Podría refactorizar para no tener que tener el proc en las condiciones de la asociación, pero me pregunto si alguien tiene una mejor solución.

El ref dice : “Si necesita evaluar las condiciones dinámicamente en tiempo de ejecución, use un proc”

He respondido a la otra pregunta con más detalles, tratando de explicar por qué esto no puede funcionar.

Cuando dicen que dynamic es porque el proceso se puede ejecutar en tiempo de ejecución, pero no en el contexto de una instancia existente de la clase de Application porque no existe cuando se invoca esta relación

 Application.where(:id => params[:id]).includes(:app_questions => :app_choices) 

La capacidad para :conditions para aceptar un proc no está documentada en la ref. Sospecho que no funciona de la manera que adivinaste.

:conditions acepta una cláusula WHERE SQL o un hash que se puede activar. Se inserta en el SQL que obtiene los registros: app_questions, y si se trata de un proc , solo se llama una vez para obtener el fragmento de la instrucción SQL que se va a construir.

Podría ayudar echar un vistazo a las relaciones de su base de datos. ¿Las aplicaciones deben vincularse a los inquilinos o solicitudes?

Suponiendo que la relación en sí funcione, podría intentar preload lugar de includes