Skip to content

Instantly share code, notes, and snippets.

@mrkurt
Created April 13, 2010 00:40
Show Gist options
  • Save mrkurt/364176 to your computer and use it in GitHub Desktop.
Save mrkurt/364176 to your computer and use it in GitHub Desktop.
def transfer_credits_to(target, amount, message = nil)
debit = Credit.new(:amount => amount * -1, :message => message)
debit.source = target
debit_params = {"_id" => self.id, "credits_amount_sum" => {'$gte' => amount}}
debit_attrs = {
'$push' =>
{'credits' => debit.raw_attributes},
'$inc' =>
{'credits_amount_sum' => debit.amount}
}
result = self.class.collection.update(debit_params, debit_attrs, :safe => true, :multi => false)
unless result[0][0]['updatedExisting']
raise "#{self.class.name} doesn't have enough credits to transfer"
end
credit = Credit.new(:amount => amount, :message => message)
credit.source = self
credit_attrs = {
'$push' =>
{'credits' => credit.raw_attributes},
'$inc' =>
{'credits_amount_sum' => credit.amount}
}
result = target.class.collection.update({'_id' => target.id}, credit_attrs, :safe => true, :multi => false)
unless result[0][0]['updatedExisting']
debit_params.delete('credits_amount_sum')
debit_attrs['$pull'] = debit_attrs.delete('$push')
debit_attrs['$inc'] = credit.amount
self.class.collection.update(debit_params, debit_attrs, :safe => true, :multi => false)
raise "#{target.class.name} #{target.id} doesn't exist in the database"
end
true
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment