Quoting Nick Hoffman <[email protected]>: > > On Jun 12, 4:54 am, Michael Schuerig <[email protected]> wrote: > > On Friday 12 June 2009, Nick Hoffman wrote: > > > > > On Thu, Jun 11, 2009 at 11:24 PM, Ashwin > > > > > Mangale<[email protected]> wrote: > > > > Try commenting out the uniqueness constraint and check the result. > > > > To be fair, the validations listed are fairly standard and can be > > > > done before the keyword object is created ( client-side using > > > > something like ajax + jquery ). > > > > > > Hope this helps. > > > > > > -Ashwin > > > > > Hi Ashwin. I'm finding that the uniqueness constraint doesn't add > > > much additional processing time. > > > > It's a bogus constraint, however, because... > > > > > You're right that the validations are quite standard. However, you > > > can't rely on input data; it must be validated server-side. > > > > it checks uniqueness in the wrong place. validates_uniqueness_of does > > not preclude an interleaving of operations of operations from two > > processes that looks like this > > > > A B > > create(:keyword => 'foo') > > validate uniqueness > > create(:keyword => 'foo') > > validate uniqueness > > save > > save > > > > To be safe, you must have a constraint in the database. If you have > > that, the additional app-level validation just wastes performance. > > > > add_index :keywords, :keyword, :unique => true > > > > Michael > > > > -- > > Michael Schuerig > > mailto:[email protected]://www.schuerig.de/michael/ > > Are you sure about that?: > http://pastie.org/509569
Your example is two saves in the same thread/process. The counter-example REQUIRES two concurrent processes/threads. And yes his counter-example is correct. Unless you can guarantee that your application will NEVER run multi-process/multi-threaded, e.g., Webrick. If your application will ever be run by multiple people at once, it will almost certainly require this. Such is the price of success. Also pushing the uniqueness validation into the database will cut your run time. The uniqueness validation is implemented by doing a lookup on the unique field before doing the insert. Letting the DB do it cuts the number of database calls in half. Doing the inserts in batches will also increase the speed significantly. Yeah, the code isn't as pretty but if it is already clear you need the speed, do it. It is doubtful that it will be the ugliest bit of code in your app. HTH, Jeffrey --~--~---------~--~----~------------~-------~--~----~ 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 [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---

