2010-07-23 75 views
4

我有一个多态关联像这样 -查询多态关联

class Image < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Page < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Site < ActiveRecord::Base 
    has_one :approval, :as => :approvable 
end 

class Approval < ActiveRecord::Base 
    belongs_to :approvable, :polymorphic => true 
end 

我需要找到approval.apporvable.deleted = false

我已经试过这样的事情的批准 -

@approvals = Approval.find(:all, 
    :include => [:approvable], 
    :conditions => [":approvable.deleted = ?", false ]) 

这使得“不能急于加载多态关联:可认可的“错误

如何正确地给出条件,以便获得可批准项目未被删除的批准结果集?

感谢所有帮助提前

+0

代替N + 1,这可能是与4个散装查询,一个用于每个关联类加在所有关联的初始准备扫描来完成。准备数据结构可以是将每个关联类映射到[source_id,association_id]的哈希。 – mahemoff 2015-04-21 09:01:07

回答

3

这是不可能的,因为所有的“可批准项”驻留在不同的表。相反,您必须获取所有批准,然后使用普通的数组方法。

@approvals = Approval.all.select { |approval| !approval.approvable.deleted? } 
3

您对SQL的要求是从结果集中不同行的不同表投影数据。这是不可能的,我的知识。

所以你必须安于:

@approvals = Approval.all.reject{|a| a.approvable.deleted? } 
# I assume you have a deleted? method in all the approvables 
1

我会建议,要么已经在这里给出的答案(他们是同样的事情),但我也建议把被删除的标志进入审批模型,如果你真的很关心在单个查询中完成这一切。

有了多态关系,rails可以使用在polys上的提前获取,但不能加入到它们中,因为关系并不知道,所以查询实际上是多个查询相交的。

因此,最终如果您真的需要,可以在单个查询中将所有可能的联接放入sql并将所有可能的联接交叉到所有类型的可批准类型,但是您必须手动进行大量联接。 (手动的意思是不使用导轨的内置机制...)

0

感谢您的回答 我非常确定,这是无法完成的。我希望更多的确认 除了我希望其他soln通过结果集 ,以避免后来的性能相关的问题 虽然暂时拒绝/选择都很好,但从长远来看,我 将不得不手动执行这些sql连接。 再次感谢您的帮助!

中号