2

ほとんどのモデルに 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 を使用してください」

4

3 に答える 3

2

なぜこれが機能しないのかを説明するために、他の質問に詳細を添えて回答しました。

彼らが動的と言うのは、実行時にprocを実行できるためですが、クラスの既存のインスタンスのコンテキストでは実行できないApplicationためです。この関係を呼び出すときに存在しないためです

Application.where(:id => params[:id]).includes(:app_questions => :app_choices)
于 2012-05-08T21:09:31.273 に答える
0

preload リレーション自体が機能すると仮定すると、代わりに試すことができますincludes

于 2012-05-08T22:31:31.750 に答える
0

:conditionsを受け入れる機能procは、参照には記載されていません。あなたが推測したようには機能しないと思います。

:conditionsWHERESQL句、またはオンにできるハッシュのいずれかを受け入れます。これは :app_questions レコードを取得する SQL に挿入され、それがprocSQL ステートメントのスニペットを構築するために 1 回だけ呼び出されます。

データベースの関係を確認すると役立つ場合があります。app_questions はテナントまたはアプリケーションにリンクする必要がありますか?

于 2012-05-08T17:18:14.787 に答える