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 ])

这给出了“不能急切地加载多态关联:approvable”错误

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

感谢您提前提供任何帮助

4

4 回答 4

3

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

@approvals = Approval.all.select { |approval| !approval.approvable.deleted? }
于 2010-07-23T15:13:37.717 回答
3

就 SQL 而言,您的要求是将来自不同表的数据投影到结果集中的不同行。据我所知,这是不可能的。

所以你必须满足于:

@approvals = Approval.all.reject{|a| a.approvable.deleted? }
# I assume you have a deleted? method in all the approvables
于 2010-07-23T15:14:14.087 回答
1

我会推荐这里已经提供的任何一个答案(它们是同一件事),但如果您真的想在一个查询中完成所有操作,我也建议将删除的标志放入 Approval 模型中。

使用多态关系,rails 可以在 polys 上使用渴望获取,但您不能加入它们,因为再一次,关系是未知的,因此查询实际上是多个查询相交的。

所以最后,如果你真的需要,进入 sql 并交叉所有可能的连接,你可以在单个查询中对所有类型的可批准项执行,但你将不得不手动执行大量连接。(手动意味着不使用 Rails 的内置机制......)

于 2010-07-23T18:01:05.790 回答
0

感谢您的回答,我很确定这是不可能的。除了通过结果集循环以避免以后出现与性能相关的问题之外,我还希望得到更多确认,尽管目前拒绝/选择都很好,但从长远来看,我将不得不做那些 sql 连接手动。再次感谢您的帮助!!

于 2010-07-23T19:48:53.263 回答