正在开发一个 Multi-Tenancy 应用程序,其中我的大多数模型都会有一个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>'
我可以重构,这样我就不必在关联条件中包含过程,但我想知道是否有人有更好的解决方案。
引用does say :“如果您需要在运行时动态评估条件,请使用过程”
最佳答案
我已经回答了另一个问题,并提供了更多详细信息,试图解释为什么这不起作用。
当他们说动态时,是因为过程可以在运行时执行,但不能在 Application
类的现有实例的上下文中执行,因为它不存在当您调用此关系时
Application.where(:id => params[:id]).includes(:app_questions => :app_choices)
关于ruby-on-rails - Rails 的 include() 不适用于动态关联条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10502307/