# Find\_or\_create, race-condition & optimistick locking & WebAPI

**URL:** <https://www.ruby-forum.com/t/find-or-create-race-condition-optimistick-locking-webapi/203118>\
**Category:** IT\
**Created:** [February 13, 2011, 11:28am UTC](https://www.ruby-forum.com/t/find-or-create-race-condition-optimistick-locking-webapi/203118 "2011-02-13T11:28:33Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![luislavena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@luislavena](https://www.ruby-forum.com/u/luislavena)\
**Post date:** [February 13, 2011, 11:28am UTC](https://www.ruby-forum.com/t/find-or-create-race-condition-optimistick-locking-webapi/203118/1 "2011-02-13T11:28:33Z")

</div>

Ciao a tutti, vorrei sottoporti questo problema per ottenere una  
soluzione quanto più pulita.

class Place \< ActiveRecord::Base  
def self.find\_or\_create\_by\_latlon(lat, lon)  
place\_id = call\_external\_webapi  
result = Place.where(:place\_id =\> place\_id).limit(1)  
result = Place.create(:place\_id =\> place\_id, … ) if result.empty?  
#!  
result  
end  
end

Poi da qualche parte in un model o controller

p = Post.new  
p.place = Place.find\_or\_create\_by\_latlon(XXXXX, YYYYY) # race-condition  
p.save

Il codice funziona come ci si aspetta solo se “Place.where” restituisce  
un record, se viene seguito “Place.create” il result restituito è spesso  
“nil” perché non viene restituito in tempo (ma è comunque eseguito).

Quello che vorrei è una specie di timeout bloccante che dicesse: “se il  
webservice non risponde entro tot secondi metti il place\_id di default”

Spero di essermi spiegato bene.

Ciao  
Luigi
