以前のステータスが現在のステータスと同じかどうかを確認し、変更があった場合にのみメールを送信できます (ポイントが円の内側にあり、以前は外側にあった、またはその逆)。
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?、インスタンスメソッドとして追加するかもしれません。次に、データベースから前のポイントを取得して、2 つを比較できます。
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 を返す) は通常、最後に疑問符を付けて名前を付け、yes/no の質問であることを示します。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