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

:conditions接受 a的能力proc没有记录在参考文献中。我怀疑它不像你想象的那样工作。

:conditions接受 SQLWHERE子句或可以打开的散列。它被插入到获取 :app_questions 记录的 SQL 中,如果它是 aproc它只调用一次以获取要构造的 SQL 语句的片段。

查看您的数据库关系可能会有所帮助。app_questions 是否应该链接到租户或应用程序?

于 2012-05-08T17:18:14.787 回答
0

假设关系本身有效,您可以尝试preload 而不是includes

于 2012-05-08T22:31:31.750 回答