2012-12-20 68 views
1

我有一個模型MyModel與返回一個特定的記錄(見下面的邏輯)的方法。紅寶石方法與for循環,意外返回

def self.find_future_rec #note2 
    rec = find(rand(MyModel.count)+1) #note1 
    while rec.nil? | (rec.expdate<Date.today) 
    rec = find(rand(MyModel.count)+1) 
    end 
    return rec 
end 

MyModel類的每個記錄具有可變Dateexpdate。 (我知道這是要找到一個記錄一個可怕的方式,這更是對我自己的薰陶,還有一些測試代碼。)

  1. 這個方法找到適當的記錄之前,經過幾個不良記錄重複,但記錄返回的總是在note 1找到的那個,第一個記錄被查詢。這裏有一些懶惰的任務嗎?
  2. 我必須在note2處添加self以便能夠在靜態上下文中調用該方法。這是正確的解釋嗎?
+0

是什麼讓你認爲你的循環迭代? –

+0

在我的終端中,我可以看到多個數據庫匹配,找到一個理想的數據後停止尋找不良記錄。 – yamori

+0

您必須添加更多信息(例如,在循環之前,之內和之後的'rec.expdate'的一些調試輸出)。 –

回答

1

find方法從不返回nil當您給它一個ID來查找:如果它找不到要查找的記錄,則會引發ActiveRecord::RecordNotFound異常。所以,rec始終是非nilrec.nil?總是假。這意味着,你的循環是很喜歡這樣的:

while rec.expdate < Date.today 

如果你的循環總是返回從#note1rec那麼你永遠不會進入所有的while循環,你總是第一個獲得一個理想的MyModel嘗試。

其他需要考慮的要點:

  1. 有時事情被刪除,以便Model.count + 1不一定是最大的ID。
  2. find引發了一個例外,表示失敗,因此您需要rescue ActiveRecord::RecordNotFound而不是檢查nil
-1

您正在使用|這是一個布爾OR。嘗試使用or||

添加self使方法成爲一個類方法(「靜態」是一個體面的近似值)確實是解決這個問題的正確方法之一。

+1

'|(通常)是一個按位或運算符,但'|'和'||'與布爾運算符相同。 –