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
-~----------~----~----~----~------~----~------~--~---

Reply via email to