您可以检查之前的状态是否与当前状态相同,只有在有变化时才发送邮件(点在圈内,之前在圈外,反之亦然)。
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
notcamelCase
用于变量和函数,并且“谓词”方法(返回 true/false)通常在末尾用问号命名,表示它们是是/否问题。您不需要代码中的注释,因为很明显point_in_circle?
返回 true 或 false。
此外,您的代码建议您的函数返回"true"
或"false"
作为字符串,这是一个非常糟糕的主意!如果您使用实际的布尔值true
or false
,您可以将原始代码编写为
def func(point, c, r)
unless point_in_circle?(point, c, r)
AlertMailer.geofence('mail@gmail.com').deliver
end
end