ほとんどのモデルに tenant_id フィールドがあるマルチテナント アプリで作業しているため、関連付け ( current_tenant.applications.find(params[:id])
)を介して検索することで読み取りアクセス許可を確保できます。
class Application < ActiveRecord::Base
belongs_to :tenant
has_many :app_questions, :conditions => proc {{:tenant_id => tenant_id}}, :dependent => :destroy
end
これにより、tenant_id が自動的に設定された新しい AppQuestion をエレガントに作成できる方法が気に入っています。
@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>'
関連条件にprocを含める必要がないようにリファクタリングできますが、より良い解決策があるかどうか疑問に思っています。
ref は次のように述べています。「実行時に条件を動的に評価する必要がある場合は、proc を使用してください」