2013-02-25 117 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