我有以下ROR代码
def func (point,c,r)
res=isPointInCircle(point,c,r) #returns true/ false
if res=='false'
AlertMailer.geofence('mail@gmail.com').deliver
end
end
每隔2分钟用不同点调用func。
isPointInCircle检查点是否在圆圈内。返回true false。
我想在第一次在圈外或圈内时发送邮件。
表示最初点在内部1小时。
没有邮件
如果外出
我希望发送一封不发生的邮件,
因为func每2分钟调用一次。 所以每隔2分钟发送一次我不想要的电子邮件。
那怎么做呢
答案 0 :(得分:4)
您可以检查以前的状态是否与当前状态相同,并且仅在发生更改时发送邮件(该点位于圆圈内且之前位于外部,反之亦然)。
def func(point, c, r)
status = point_in_circle?(point, c, r)
if last_status != status
AlertMailer.geofence('mail@gmail.com').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('mail@gmail.com').deliver
end
end
一些指示:Ruby通常使用snake_case
而非camelCase
用于变量和函数,而“谓词”方法(返回true / false)通常在末尾用问号命名以指示他们是/不是问题。您不需要在代码中添加注释,因为很明显point_in_circle?
返回true或false。
此外,您的代码建议您的函数返回"true"
或"false"
作为字符串,这是一个非常糟糕的主意!如果您使用实际的布尔值true
或false
,则可以将原始代码编写为
def func(point, c, r)
unless point_in_circle?(point, c, r)
AlertMailer.geofence('mail@gmail.com').deliver
end
end