Hello,

Last summer I wrote the activerecord-delay_touching gem to fix a 
performance problem. The gem has been used in production for six months on 
multiple sites. I am writing now to propose that I merge this gem into 
Rails. 

I’d like to get feedback on this proposal before I create the PR, because 
it’s a non-trivial amount of work. (E.g., replace Rspec with Minitest, 
remove Timecop from the specs, etc.)

*The problem*: for key-based expiration of fragment caches in Rails, you 
typically use touch: true on the belongs_to statement. But when you create 
or update N records that all belong_to the same owning record, the 
cascading touches cause that record to be touched N times. All those DB 
round-trips turn out to be really slow. It’s similar to the traditional N+1 
query problem, only for updates. This can happen even if you only make a 
single `save` call--e.g., when you use accepts_nested_attributes_for.

*The solution*: batch up your ActiveRecord “touch” operations into the 
smallest possible number of DB round-trips. This speeds things up a LOT. (I 
had numbers last summer from the app I was working on; I’ve since lost 
them. I’ll work on regenerating them.)

*How*: by calling delay_touching. I modeled this API on the no_touching API 
that was introduced in Rails 4.1:

ActiveRecord::Base.delay_touching do
  @person.update(person_params)
end

There’s more detail about what the gem does, how it works, and a couple of 
potential gotchas in the README:

https://github.com/godaddy/activerecord-delay_touching/

Feedback? Shall I go ahead?

Brian Morearty
​

-- 
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 rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to