2013-01-04 79 views
2

我有以下ROR代碼ROR代碼發送郵件很多

def func (point,c,r)   
    res=isPointInCircle(point,c,r) #returns true/ false 
if res=='false'    
    AlertMailer.geofence('[email protected]').deliver 
end 
end 

func被要求每2分鐘有不同點。

isPointInCircle檢查點是否在圓圈內或不是。返回true false。

我想發送郵件時,點是第一次在圈子外面或內部。

  • 意思是如果最初點在裏面1小時。

    沒有郵件

  • ,如果去外面

    我想一個郵件發送這不會發生,

    因爲func被稱爲每2分鐘。 所以電子郵件發送每2分鐘,我不想要。

那麼如何做到這一點

回答

4

你可以檢查,如果前一個狀態是一樣的當前狀態,只發送了郵件,如果出現了變化(點爲圓內,它之前在外面,反之亦然)。

def func(point, c, r) 
    status = point_in_circle?(point, c, r) 
    if last_status != status 
    AlertMailer.geofence('[email protected]').deliver 
    end 
end 

很難說如何實現last_status不知道更多關於你的應用程序。如果有Point模型,我可能會添加in_circle?作爲實例方法。然後,你可以從數據庫中獲取前一點,比較兩個:

def check_point_status(current, previous, c, r) 
    if current.in_circle?(c, r) != previous.in_circle?(c, r) 
    AlertMailer.geofence('[email protected]').deliver 
    end 
end 

幾個指針:紅寶石通常採用snake_casecamelCase變量和函數,和「上游」的方法(返回true/false)被通常在最後用問號命名以表明他們是/否問題。您不需要在代碼中使用註釋,因爲point_in_circle?顯然會返回true或false。

此外,您的代碼建議您的函數返回"true""false"作爲字符串,這是一個非常糟糕的主意!如果您使用的實際布爾值truefalse,你可以寫你的原始代碼

def func(point, c, r)   
    unless point_in_circle?(point, c, r)    
    AlertMailer.geofence('[email protected]').deliver 
    end 
end 
+0

好......要命suggession..Thanks –