2

我有以下 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

func 每 2 分钟调用一次,不同点。

isPointInCircle 检查点是否在圆内。返回真假。

我想在第一次在圈外或圈内时发送邮件。

  • 表示最初点是否在内部 1 小时。

    没有邮件

  • 如果它出去

    我希望发送一封不会发生的邮件,

    因为 func 每 2 分钟调用一次。所以电子邮件每 2 分钟发送一次,这是我不想要的。

那么如何做到这一点

4

1 回答 1

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_casenotcamelCase用于变量和函数,并且“谓词”方法(返回 true/false)通常在末尾用问号命名,表示它们是是/否问题。您不需要代码中的注释,因为很明显point_in_circle?返回 true 或 false。

此外,您的代码建议您的函数返回"true""false"作为字符串,这是一个非常糟糕的主意!如果您使用实际的布尔值trueor false,您可以将原始代码编写为

def func(point, c, r)          
  unless point_in_circle?(point, c, r)             
    AlertMailer.geofence('mail@gmail.com').deliver
  end
end
于 2013-01-04T10:18:51.200 回答