If you will allow me my 2cents :)

Record locking is one of the 'not invented here' features of most RDBMS's and 
hence Rails ;)

We added an abstract class which all models inherits from (instead of 
ActiveRecord::Base) and implemented a few "core" methods on this class (and 
made sure all migrations of new models contains a 'locked_by int' field)

def can_edit?(usr)
  # has usr permissions (with CanCan or else how)
end

def locked?(user_id)
  exec "update #{table_name} set locked_by=#{user_id} where id=#{id} and 
locked_by=0"
end

which allowed us to do this (in the controllers)

def edit
  ..
  if can_edit?(current_user) && locked?(current_user)
    # render like any other day
  else
    # inject a flash with the error (either no edit permissions or not locked 
by current_user)
  end
end

def update
  ..
  params[:what_ever][:locked_by]=0
  if resource.update_attributes(params[:what_ever])
    ..
end

Currently, we are looking into the "collateral damage" (users starting to 
editing a record and then leaving for coffee, having a stroke or just plain 
drifts about in there, like it was Google search - leaving a bunch of locked 
records in their wake) - but hey, any solution is the offspring to a new 
challenge, right :) 

Originally we tried with optimistic locking and we did not like it at all - too 
many users saving data on top of each other - but then again that may just have 
been us implementing it the wrong way :(

Like I said - just my 2cents - and probably not what you wanted <:)


cheers
Walther


ps. the above code is part pseudo-code - part copy/paste - you'd get the drift 
if it suits you, and ironing the 'small-print' out would not be a big feast :)
   

Den 25/02/2013 kl. 18.28 skrev Brian McManus <[email protected]>:

> I'm working on an app that makes use of rails' optimistic locking feature and 
> seeing some possibilities for improvements.  It seems a bit tedious to have 
> to add :lock_version to forms wherever the model is used.  You also have to 
> "hack" around rails' UJS feature to add it as a URL parameter when using 
> remote: true, method: [:put, :patch, :post, :delete].  On the controller side 
> in rails 4 (or if you're just using the strong_parameters gem in 3.x) you 
> have to remember to permit the :lock_version parameter wherever you're using 
> that model or it will just be silently ignored rendering the protection 
> useless.
> 
> It seems like this could all be handled in rails core by introspecting the 
> form object and injecting the lock_version as we do with the id and :method 
> currently.  I'm having problems figuring out how to address it on the UJS 
> side.  My current idea is to add a lock_with: option to link_to that works 
> similarly to :remote, :method, :confirm, etc.  Also, I can't see any 
> obviously clean way to handle this magically wrt strong_parameters since 
> there is nothing inherent in strong_parameters that provides knowledge about 
> the model that may eventually be created/updated from said parameters.  
> Current plan there would be to create a module you can include in 
> ActionController::StrongParameters that would automatically append 
> :lock_version whenever permit is called.  Not sure how to handle if you 
> change the lock column name in your model though...
> 
> Is this a viable approach for core or would this be better served as a gem 
> that just monkey patches everything it needs to if they are present in the 
> user's app?
> 
> Thanks in advance!
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Ruby on Rails: Core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to