2

Работает в приложении с несколькими арендаторами, где у большинства моих моделей будет поле tenant_id, поэтому я могу обеспечить разрешение на чтение путем поиска через ассоциацию (current_tenant.applications.find(params[:id])):Rails 'includes() не работает с условиями динамической ассоциации

class Application < ActiveRecord::Base 
    belongs_to :tenant 
    has_many :app_questions, :conditions => proc {{:tenant_id => tenant_id}}, :dependent => :destroy 
end 

Мне нравится, как это позволяет мне элегантно создать новый AppQuestion с tenant_id набор автоматически:

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

Проблема заключается в том, когда я пытаюсь использовать includes() нетерпеливым нагружать ассоциацию он выдает ошибку:

current_tenant.applications.where(:id => params[:id]).includes(:app_questions => :app_choices).first 

NoMethodError (undefined method `tenant_id' for #<Class:0x007fbffd4a9420>): 
    app/models/application.rb:7:in `block in <class:Application>' 

Я мог бы реорганизовать, чтобы у меня не было процесса в условиях ассоциации, но мне интересно, есть ли у кого-то лучшее решение.

терпение does say: «Если вам нужно оценить условия динамически во время выполнения, используйте процедурный»

+0

просто нашел еще один плакат с такой же проблемой: http://stackoverflow.com/questions/6684521/rails-including-associations-with-dynamic-conditions – tybro0103

ответ

2

Я ответил на другой вопрос более подробно, пытаясь объяснить, почему это не может работать.

Когда они говорят, что динамический происходит потому, что процедура может быть выполнена во время выполнения, но не в контексте существующего экземпляра Application класса, потому что он не существует, когда вы вызываете это соотношение

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

Способность :conditions принять proc не документированы в исх. Я подозреваю, что это не работает так, как вы предполагали.

:conditions принимает либо предложение SQL WHERE, либо хэш, который можно включить. Он вставлен в SQL, который получает записи: app_questions, а если это proc, он вызывается только один раз, чтобы получить фрагмент инструкции SQL, которую нужно построить.

Это может помочь взглянуть на ваши отношения с базой данных. Должно ли app_questions ссылаться на арендаторов или приложений?

+1

На самом деле это: http://guides.rubyonrails.org/association_basics.html#has_many-conditions QUOTE: «Если вам нужно динамически оценивать условия во время выполнения, используйте proc:« – tybro0103

+0

И, как уже упоминалось, большинство моих моделей у них есть tenant_id. Он избыточен, но он оптимизирует проверку разрешений. – tybro0103

0

Предполагая, что отношение само по себе работает, вы можете попробовать preload вместо includes