Sebastian von Conrad
2009-Sep-24 23:47 UTC
Overriding a single Rails core file (batches.rb)
Hi everyone, I''m trying to find a way to implement a diff I found into my application (https://rails.lighthouseapp.com/projects/8994/tickets/ 2137-allow-find_batches-to-use-order-limit-and-offset). It is imperative that I use find_in_batches as well as passing an :order option to the function. Certain rows need to be processed before others, and because of the size of the table I can''t do them all at once. Now, my question is, how could I do this with the least amount of fuss? I don''t want to edit the batches.rb in my Rails installation, as I then would have to do the same on servers and other workstations. I also don''t particularly want to freeze Rails. I''ve tried just slapping a new batches.rb into /vendor/rails/activerecord/lib/active_record/, hoping that that would override just that file, but it doesn''t seem to work. Any help would be appreciated! Best regards, Sebastian
Sebastian, Since it''s an ActiveRecord module that gets included into AR::Base, you either need to: 1) (Sneaky) Load your own Batches module when AR wants to autoload it (active_record.rb:51) - override Module#autoload to ''listen'' for the Batches module, and substitute your version (located in /lib or something) instead. You''ll have to do this before Rails loads AR, though, so put it in /config/preinitializer.rb. 2) (More sane) Monkey-patch the changed methods into AR::B through a file you include in /lib, /config/initializers or through your own plugin. You would probably be overriding #find_in_batches, #sort_batch_rows! and #select_batch_ids. 3) Freeze rails, replace the file. This is the simplest, and least error-prone, though upgrading and patching Rails may be trickier. Colin On Thu, Sep 24, 2009 at 4:47 PM, Sebastian von Conrad <sebastian.von.conrad-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > Hi everyone, > > I''m trying to find a way to implement a diff I found into my > application (https://rails.lighthouseapp.com/projects/8994/tickets/ > 2137-allow-find_batches-to-use-order-limit-and-offset). It is > imperative that I use find_in_batches as well as passing an :order > option to the function. Certain rows need to be processed before > others, and because of the size of the table I can''t do them all at > once. > > Now, my question is, how could I do this with the least amount of > fuss? I don''t want to edit the batches.rb in my Rails installation, as > I then would have to do the same on servers and other workstations. I > also don''t particularly want to freeze Rails. I''ve tried just slapping > a new batches.rb into /vendor/rails/activerecord/lib/active_record/, > hoping that that would override just that file, but it doesn''t seem to > work. > > Any help would be appreciated! > > Best regards, > Sebastian > > >
Sebastian von Conrad
2009-Sep-25 01:12 UTC
Re: Overriding a single Rails core file (batches.rb)
Colin, Thanks! I will most likely go with option 2. Can I just copy-paste the modified methods as per the diff into any of those directories (obviously with "module ActiveRecord" and "module Batches" at the top)? Do I need to adhere to a specific naming scheme for the file? Apologies for all the questions. I''m still (re-)learning Rails. Best regards, Sebastian On Sep 25, 10:05 am, Colin Curtin <colin.t.cur...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Sebastian, > > Since it''s an ActiveRecord module that gets included into AR::Base, > you either need to: > > 1) (Sneaky) Load your own Batches module when AR wants to autoload it > (active_record.rb:51) - override Module#autoload to ''listen'' for the > Batches module, and substitute your version (located in /lib or > something) instead. You''ll have to do this before Rails loads AR, > though, so put it in /config/preinitializer.rb. > > 2) (More sane) Monkey-patch the changed methods into AR::B through a > file you include in /lib, /config/initializers or through your own > plugin. You would probably be overriding #find_in_batches, > #sort_batch_rows! and #select_batch_ids. > > 3) Freeze rails, replace the file. This is the simplest, and least > error-prone, though upgrading and patching Rails may be trickier. > > Colin > > On Thu, Sep 24, 2009 at 4:47 PM, Sebastian von Conrad > > <sebastian.von.con...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Hi everyone, > > > I''m trying to find a way to implement a diff I found into my > > application (https://rails.lighthouseapp.com/projects/8994/tickets/ > > 2137-allow-find_batches-to-use-order-limit-and-offset). It is > > imperative that I use find_in_batches as well as passing an :order > > option to the function. Certain rows need to be processed before > > others, and because of the size of the table I can''t do them all at > > once. > > > Now, my question is, how could I do this with the least amount of > > fuss? I don''t want to edit the batches.rb in my Rails installation, as > > I then would have to do the same on servers and other workstations. I > > also don''t particularly want to freeze Rails. I''ve tried just slapping > > a new batches.rb into /vendor/rails/activerecord/lib/active_record/, > > hoping that that would override just that file, but it doesn''t seem to > > work. > > > Any help would be appreciated! > > > Best regards, > > Sebastian
Sebastian von Conrad
2009-Sep-25 02:01 UTC
Re: Overriding a single Rails core file (batches.rb)
Nevermind, figured it out. Thanks again! - Sebastian On Sep 25, 10:12 am, Sebastian von Conrad <sebastian.von.con...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Colin, > > Thanks! > > I will most likely go with option 2. Can I just copy-paste the > modified methods as per the diff into any of those directories > (obviously with "module ActiveRecord" and "module Batches" at the > top)? Do I need to adhere to a specific naming scheme for the file? > > Apologies for all the questions. I''m still (re-)learning Rails. > > Best regards, > Sebastian > > On Sep 25, 10:05 am, Colin Curtin <colin.t.cur...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Sebastian, > > > Since it''s an ActiveRecord module that gets included into AR::Base, > > you either need to: > > > 1) (Sneaky) Load your own Batches module when AR wants to autoload it > > (active_record.rb:51) - override Module#autoload to ''listen'' for the > > Batches module, and substitute your version (located in /lib or > > something) instead. You''ll have to do this before Rails loads AR, > > though, so put it in /config/preinitializer.rb. > > > 2) (More sane) Monkey-patch the changed methods into AR::B through a > > file you include in /lib, /config/initializers or through your own > > plugin. You would probably be overriding #find_in_batches, > > #sort_batch_rows! and #select_batch_ids. > > > 3) Freeze rails, replace the file. This is the simplest, and least > > error-prone, though upgrading and patching Rails may be trickier. > > > Colin > > > On Thu, Sep 24, 2009 at 4:47 PM, Sebastian von Conrad > > > <sebastian.von.con...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > Hi everyone, > > > > I''m trying to find a way to implement a diff I found into my > > > application (https://rails.lighthouseapp.com/projects/8994/tickets/ > > > 2137-allow-find_batches-to-use-order-limit-and-offset). It is > > > imperative that I use find_in_batches as well as passing an :order > > > option to the function. Certain rows need to be processed before > > > others, and because of the size of the table I can''t do them all at > > > once. > > > > Now, my question is, how could I do this with the least amount of > > > fuss? I don''t want to edit the batches.rb in my Rails installation, as > > > I then would have to do the same on servers and other workstations. I > > > also don''t particularly want to freeze Rails. I''ve tried just slapping > > > a new batches.rb into /vendor/rails/activerecord/lib/active_record/, > > > hoping that that would override just that file, but it doesn''t seem to > > > work. > > > > Any help would be appreciated! > > > > Best regards, > > > Sebastian