ruby-on-rails - Rails 的 include() 不适用于动态关联条件

标签 ruby-on-rails ruby ruby-on-rails-3 activerecord associations

正在开发一个 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/

相关文章:

sql - 按子模型属性对 ActiveRecord 模型进行排序?

ruby-on-rails - 未定义的方法 `paginate'

ruby - 让它更简单,这样它会更快

ruby-on-rails - Ruby on Rails 忽略 If Else 语句

unit-testing - 给定一个典型的 Rails 3 环境,为什么我无法执行任何测试?

ruby-on-rails - 将模型放入另一个模型时缺少部分

ruby-on-rails - 用于 CSV 上传的 Rspec

python - Ubuntu 中的 PDF 到 PPT 转换器

ruby-on-rails - rails :confirm does not show dialog box

sql - Rails - 如何从产品类别中获取所有制造商?