Right now I’m building a call tracking app to learn rails and twilio. The app has 2 relevant models ; The Plans model has_many users. The plans table also has the value max_minutes.
I want it to make it so that when a particular user goes over their max_minutes, their sub account is disabled, and I can also warn them to upgrade in the view.
To do this, here’s a parameter I created in the User class
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
This allows me to run if/else statements in the view to urge them to upgrade. However, I’d also like to make an if/else statement where, if at_max_minutes? than the user’s twilio subaccount is disabled, else, it’s enabled.
I’m not sure where I would put that though in rails.
It would look something like this
@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
BUT, I’m not sure where I would put this code, so that it’s active all the time.
How would you implement this code, for the functionality to work?
Instead of constantly computing the total minutes used in at_max_minutes?, why not keep track of a user’s used minutes, and set the status to “suspended” on the transition (when used minutes goes over max_minutes). Then your view and call code would only have to check status (you may also want to store status directly on user, to save API calls over to Twilio).
Add to User model:
When every call ends, update minutes:
Add an after_save to User: