【问题标题】:How to get scope with polymorphic association如何通过多态关联获得范围
【发布时间】:2017-04-07 16:06:30
【问题描述】:

我正在构建一个 Rails 5 应用程序,在这个应用程序中我有两个模型。 第一个称为 Timeoff,第二个称为 Approval。

我想获取所有未获得批准的 Timeoff 对象。

休假模式

class Timeoff < ApplicationRecord

  scope :not_approved, -> { self.approvals.size > 0 }

  has_many :approvals, as: :approvable, dependent: :destroy

end

批准模型

class Approval < ApplicationRecord

  belongs_to :approvable, polymorphic: true

end

我这样称呼它

Timeoff.not_approved

我收到错误消息

NoMethodError: undefined method `approvals' for #<Class:0x007f9698587830>

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-5


    【解决方案1】:

    您试图在类上下文中调用approvals,但它实际上属于Timeoff 的一个实例。例如:

    Timeoff.approvals # doesn't work
    Timeoff.first.approvals # works
    

    这就是您收到undefined method 错误的原因。 但我认为您想要在这里进行数据库查询。您可以采取两种方式 - 我知道:

    进行两个查询:找到具有approvalstimeoffs,然后使用NOT IN 查询其他的

    timeoff_ids = Approval.where(approvable_type: 'Timeoff').pluck(:approvable_id)
    Timeoff.where.not(id: timeoff_ids)
    

    如果您的表很大,这可能会变得非常慢。 或者您可以在 approvals 表上进行连接并过滤到 id 为空的位置:

    Timeoff.joins("LEFT JOIN approvals ON timeoffs.id = approvals.approvable_id AND approvals.approvable_type = 'Timeoff'").where("approvals.id IS NULL")
    

    这也应该有效,并且可能更快 - 但您应该使用自己的数据进行测量以确保。

    另外,看看这个问题:How to select rows with no matching entry in another table? 有第二个查询的完整解释和一些其他的解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多