1

這應該非常簡單。通過詢問可能讓自己感到尷尬。 :)
雖然我還是新的紅寶石/鐵軌。當條件匹配時打破循環

如果符合條件,我想跳出循環。
銷售完成後,所有物品都已售出。我想能夠使用sale.is_complete?

class Sale < ActiveRecord::Base 
    has_many :items 

    def is_complete? 
    items.each do |item| 
     # as soon as i encounter an unsold item, i want to return false to is_complete 
     # item.is_sold? will return true or false 
    end 
    end 

end 
+0

順便說一句:在Ruby中謂詞方法的命名約定是謂詞?而不是'is_predicate?'。它是一個謂詞的事實已經由問號表示,「is_」前綴是多餘的。 – 2013-02-22 01:42:08

+0

好點。謝謝。 – 2013-02-22 13:44:23

回答

7

在這種情況下,循環是不是最好的方式。

​​
+1

+1。可讀和早打破。 – steenslag 2013-02-21 22:15:01

+0

紅寶石很漂亮。謝謝。 – 2013-02-21 22:23:47

+0

如何將參數傳遞給&:is_sold ?,以防我需要,例如: items.all?(&:is_sold_above?20) – demee 2013-09-15 20:05:34

3

也許不那麼尷尬:

def is_complete? 
    items.each do |item| 
     if not item.is_sold? then return false 
    end 
    return true 
    end 
+0

這就是你如何在C中完成它,但它不是慣用的Ruby:1)存在抽象'Enumerable#all',2)你不會爲方法的最後一個表達式顯式地寫入'return'。內聯條件是另一種方式... – tokland 2013-02-21 22:11:20

+0

確實如此,雖然問題明確要求打破循環。我可以給出它「應該」是什麼,或者我不應該假設示例代碼是OP想要解決的問題。至於最後一行,我只是想強調使用'return'語句。沒有傷害完成。 – deau 2013-02-21 22:19:56

+1

夠公平的。但是也許你會用'break'。 – tokland 2013-02-21 22:22:47

3

我不認爲你想循環通過每個項目。這將是非常低效的。更好的方法是檢查未售出物品的數量。例如,假設Items Table有一個名爲sold的列,該列存儲true或false值。然後我們可以這樣做:

def is_complete? 
    items.where(sold: false).present? 
end 
+0

請注意,您可以編寫更多的聲明性'items.where(sold:false)。現在?' – tokland 2013-02-21 22:10:54

+0

謝謝。我更新了答案。 – Max 2013-02-21 22:11:32

+0

甚至'items.exists?(sold:false)' – 2013-02-22 06:10:20