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 は、ポイントが円内にあるかどうかをチェックします。true false を返します。

ポイントが初めてサークル外またはサークル内にあるときにメールを送信したい。

  • 最初にポイントが 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?、インスタンスメソッドとして追加するかもしれません。次に、データベースから前のポイントを取得して、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
于 2013-01-04T10:18:51.200 に答える