如何简化这种方法?

时间:2013-02-25 09:20:56

标签: ruby-on-rails

在reports.rb中,我有:

has_and_belongs_to_many :elements

在elements.rb中,我有:

has_and_belongs_to_many :reports

以下方法有效,但似乎比它应该更长:

@elements = []
Element.all.each do |element|
  @elements << element if element.reports.empty?
end

我已尝试过以下操作,但由于没有报告列,因此无效:

@element = Element.where(reports.empty?)

不幸的是,我尝试过冲入Rails API引用的所有单词 - 查找等 - 都是如此通用,以至于我找不到一种方法可以在where到{{1}}时看到我的方式工作。有吗?或者是否有其他方法可以简化此方法?

2 个答案:

答案 0 :(得分:1)

我能想出一种以低级别方式做到这一点的方法。

Element
  .joins("LEFT OUTER JOIN element_reports")
  .group("elements.id")
  .having("element_reports.id IS NULL")

这至少将过滤的责任推到了数据库,而不是提取所有记录。这应该是一个胜利,特别是如果有很多记录,或者它们特别胖。

答案 1 :(得分:0)

答案结果是:

@elements = Element.all.keep_if {|e| e.reports.empty?}