2013-02-25 112 views
0

在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引用的所有单词 - find等等 - 都是非常通用的,所以我找不到一种方法可以在你工作时看到我。有一个吗?或者还有其他一些方法可以简化这种方法吗?

+0

不是一个解决办法,而是要表达这个循环会像'@elements = {Element.all.select更习惯的方法|元素| element.reports.empty? }' – 2013-02-25 09:37:15

回答

0

回答竟然是:

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

这将最终比做数据库中的所有工作慢得多。您可能没有注意到开发中的任何差异,但是通过相关报告填充几个(或几十个)元素并做一些基准测试。 – Pavling 2013-02-25 10:58:07

+0

感谢您的提醒。在这种情况下,所有这些都是针对应用程序的管理区域,我一个人都会使用它,所以我对响应时间没有太大的压力。但是如果它成为一个问题,我一定会在数据库层面上做这件事。 – 2013-02-26 03:22:53

1

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

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

这至少会将筛选的责任推到数据库,而不是获取所有记录。这应该是一个胜利,特别是如果有很多记录,或者如果他们特别胖。

+1

可能是我的星期一早晨大脑迟迟没有在这里,但是coudn't'having'子句是'where'? – 2013-02-25 09:33:45

+0

是的,那么我们也可以消除这个群体。 :-) – 2013-02-25 09:34:45