[LRUG] Best way to implement an increasing number?

Srushti Ambekallu srshti at gmail.com
Fri Apr 19 02:55:10 PDT 2013


> Also presumably you should have
> 
> validates_presence_of :code


And possibly:
	validates_uniqueness_of :code, :scope => :a_id

I'm guessing that would fail the save in code, rather than deadlocking in the DB, and which would then let you handle the error in code and trying another save.

Srushti
http://c42.in

On 19-Apr-2013, at 2:40 PM, Jonathon Horsman wrote:

> Hi Andy
> 
> Any reason not to use
> 
> before_validation :set_code
> 
> rather than
> 
> after_create :set_code
> 
> and set_code method merely sets the value on the object rather than hit the database a second time?
> 
> Also presumably you should have
> 
> validates_presence_of :code
> 
> Regards
> 
> 
> On 19 April 2013 09:51, Andrew Stewart <boss at airbladesoftware.com> wrote:
> Hello El Rug,
> 
> Today's question sounds simple – and probably is – but I seem to have answered it wrongly in my code.
> 
> I have two classes A and B, where A has many Bs and B belongs to A.
> 
> B has a `code` method which returns a candidate key (I think that's the correct term), i.e. a unique identifier.  It has some domain-meaningful text and a number.  The number is what distinguishes the codes of two Bs belonging to the same A.  Once a B's code is set at creation it must not change.
> 
> My current implementation looks like:
> 
>     class A < ActiveRecord::Base
>       has_many :bs
> 
>       def next_number
>         increment! :number
>         number
>       end
>     end
> 
>     class B < ActiveRecord::Base
>       belongs_to :a
>       after_create :set_code
> 
>       private
> 
>       def set_code
>         update_attributes code: "#{a.name}-#{'%03d' % a.next_number}"
>       end
>     end
> 
> This has been working when adding Bs individually but recently I introduced bulk import of Bs from spreadsheets.  During imports in production I've begun to see MySQL deadlocks such as:
> 
> #<ActiveRecord::StatementInvalid: Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: UPDATE `as` SET `number` = 193, `updated_at` = '2013-04-19 07:40:29' WHERE `as`.`id` = 3025>
> 
> There must be a better way to do this...?
> 
> Thanks in advance,
> 
> Andy Stewart
> 
> 
> _______________________________________________
> Chat mailing list
> Chat at lists.lrug.org
> http://lists.lrug.org/listinfo.cgi/chat-lrug.org
> 
> 
> 
> -- 
> Jonathon Horsman
> Director
> Arctic Kiwi
> Mobile: 079 42366038
> Web: http://www.arctickiwi.com
> Twitter: @jhorsman
> 
> _______________________________________________
> Chat mailing list
> Chat at lists.lrug.org
> http://lists.lrug.org/listinfo.cgi/chat-lrug.org

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lrug.org/pipermail/chat-lrug.org/attachments/20130419/29b8901c/attachment-0003.html>


More information about the Chat mailing list