使用多态关联过滤和求和模型

Filter and sum Model with Polymorphic Associations

我有 3 个模型 - 捐赠、人员、组织

class Donation < ActiveRecord::Base
   belongs_to :donatable, polymorphic: true
end

class Person < ActiveRecord::Base
   belongs_to :branch
   has_many :donations, as: :donatable
end

class Organization < ActiveRecord::Base
   belongs_to :branch
   has_many :donations, as: :donatable
end

捐款可以来自个人或组织。人员和组织属于分支机构。

我正在尝试过滤来自特定分支机构的捐款并将它们合计,这是我写的范围:

scope :for_branch, lambda { |branch_id| 
    return nil  if branch_id.blank?
    joins(:donatable).where(:branch_id => branch_id)
}

它 returns 错误:

Cannot eagerly load the polymorphic association :donatable

我怎样才能完成任务?

您必须将所有 PersonOrganization 外连接到匹配的 Donation(通过限制 donatable_type)。

然后你 select 所有 Donations 其中任何连接的 brach_id 列匹配。

外连接必须指定为 .joins('..')

Donation.joins("left join persons on persons.donatable_id = donations.id").joins("left join organizations on organizations.donatable_id = donations.id").where('persons.branch_id=? OR organizations.branch_id=?', branch_id, branch_id)

如果你需要一个范围

scope :by_branch, lambda { |branch_id|
   return nil  if branch_id.blank?
   joins: ["left join persons on persons.donatable_id = donations.id",
           "left join organizations on organizations.donatable_id = donations.id"],
   conditions: %('persons.branch_id=#{branch_id} OR organizations.branch_id=#{branch_id})
}