24 Jul 19:04
Re: Validation method vs. After Save & Rollback
From: Philip Hallstrom <philip@...>
Subject: Re: Validation method vs. After Save & Rollback
Newsgroups: gmane.comp.lang.ruby.rails
Date: 2008-07-24 17:04:14 GMT
Subject: Re: Validation method vs. After Save & Rollback
Newsgroups: gmane.comp.lang.ruby.rails
Date: 2008-07-24 17:04:14 GMT
> Thanks Philip, would you mind clarifying the wrapping in a > transaction? Im just not quite sure what the means/entails You want to ensure that that piece of code can only run at once at a time. Transaction isn't probably the best word for it. Synchronized lock, mutex, etc. Google around for those terms. > On Jul 23, 2:03 pm, Philip Hallstrom <phi...@...> wrote: >> On Jul 22, 2008, at 7:53 PM,validkeyswrote: >> >> >> >> >> >>> Hey Guys, >> >>> Again, I am just learning Rails, so I am asking advice here. >> >>> I have a model called Company which has many Owners. The Owners >>> model >>> indicates the name of the owner and their share (as a percentage) of >>> the company. The total shares for any one company can not be more >>> than >>> 100%. >> >>> So if I have 10 owners each with 10% of the company and I update one >>> of the owners and set their share to 11%, I should be given a >>> warning >>> message. >> >>> This is what I have done in my Owner model: >> >>> def more_than_100_given_away? >>> # => find the total share >>> company = Company.find(company_id) >>> company_total_share = company.total_share # => This is summing the >>> old value >>> if changed? >>> if changes["share"] # => Changes to a model are stored in the >>> changes array on the instance, the array has 2 value ["from_value", >>> "to_value"] >>> old_value = changes["share"][0].to_f # => Convert To Float >>> new_value = changes["share"][1].to_f >>> new_total_share = company_total_share - old_value + new_value >>> new_total_share > 100.01 >>> else >>> false # validation succeeds >>> end >>> else >>> false # validation succeeds >>> end >>> end >> >>> It is working for me just fine, but I wanted to know if there was a >>> better (less NOOB looking way to do this) >> >> For the most the above seems reasonable. There are a couple of >> things >> I'd watch out for though. >> >> - Near as i can tell a company could give away 100.009 shares. >> Sure, . >> 009 isn't that much, but it could be. And it's more than 100. Of >> course dealing with float rounding sucks. Don't know if it's an >> option, but you may want to consider storing the total number of >> shares for a company and track the number of shares per owner. That >> keeps everything in integer values. If you want to get an owner's >> percentage of ownership do the calculation then, but only for display >> purposes. >> >> - The other problem is concurrency. What if I update two records at >> the same time and set them both to own 60% (assume individually they >> would succeed). They'll both succeeed if I time it right. So you >> should wrap this in a transaction so that can't happen. >> >> -philip > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk@... To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@... For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
RSS Feed