使用多态关联过滤和求和模型
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
我怎样才能完成任务?
您必须将所有 Person
和 Organization
外连接到匹配的 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})
}
我有 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
我怎样才能完成任务?
您必须将所有 Person
和 Organization
外连接到匹配的 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})
}