0

現在、Rails と twilio を学習するためのコール トラッキング アプリを作成しています。アプリには 2 つの関連モデルがあります。Plans モデルには、多くのユーザーがいます。計画表には、値 max_minutes もあります。

特定のユーザーが max_minutes を超えるとサブアカウントが無効になり、ビューでアップグレードするように警告できるようにしたいです。

これを行うために、 User クラスで作成したパラメーターを次に示します

  def at_max_minutes?
    time_to_bill=0
    start_time = Time.now - ( 30 * 24 * 60 * 60) #30 days
    @subaccount = Twilio::REST::Client.new(@user.twilio_account_sid, @user.twilio_auth_token)
    @subaccount.calls.list({:page => 0, :page_size => 1000, :start_time => ">#{start_time.strftime("%Y-%m-%d")}"}).each do |call|
      time_to_bill += (call.duration.to_f/60).ceil
    end

    time_to_bill >= self.plan.max_minutes 

  end 

これにより、ビューで if/else ステートメントを実行して、アップグレードを促すことができます。ただし、if/else ステートメントも作成したいと思います。ユーザーの twilio サブアカウントが無効になっている場合、それ以外の場合は有効になっています。

レールのどこにそれを置くのかわかりません。

それはこのように見えるでしょう

  @client = Twilio::REST::Client.new(@user.twilio_account_sid, @user.twilio_auth_token)
  @account = @client.account
  if at_max_minutes?
    @account = @account.create({:status => 'suspended'})
  else
    @account = @account.create({:status => 'active'})
  end

しかし、このコードをどこに配置すればよいかわかりません。そのため、常にアクティブになっています。

機能を動作させるために、このコードをどのように実装しますか?

4

2 に答える 2

0

「常にアクティブ」にしたい場合は、このチェックのために、ある種のスケジュールされたバックグラウンドジョブを実行する必要があります。Railsの非常に優れたスケジューリングソリューションであるresque-schedulerを使用したresqueを勧めします。基本的には、指定したコードの2番目のブロックを実行するジョブを作成し、定期的に(2時間ごとに)実行することです。

于 2012-10-08T16:56:03.173 に答える
0

at_max_minutes? で使用された合計分数を常に計算する代わりに、ユーザーの使用分数を追跡し、移行時にステータスを「一時停止」に設定してみませんか (使用分数が max_minutes を超えた場合)。そうすれば、ビューと呼び出しのコードでステータスを確認するだけで済みます (API 呼び出しを Twilio に保存するために、ステータスをユーザーに直接保存することもできます)。

ユーザーモデルに追加:

 used_minutes

すべての通話が終了したら、議事録を更新します。

def on_call_end( call )
  self.used_minutes += call.duration_in_minutes # this assumes Twilio gives you a callback and has the length of the call)
  save!
end

ユーザーに after_save を追加します。

after_save :check_minutes_usage

def check_minutes_usage
  if used_minutes >= plan.max_minutes
    @account = @account.create({:status => 'suspended'})
  else
    @account = @account.create({:status => 'active'})
  end
end
于 2012-10-08T20:55:44.307 に答える