Forum: Ruby on Rails Monkey Patching a Plugin

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
8d38199a01d2243e313c48456c6ddff9?d=identicon&s=25 Daly (Guest)
on 2009-03-11 15:03
(Received via mailing list)
I am using a plugin that adds a method to ActiveRecord::Base. The
added method is called self.create_or_update. I need to monkey patch
this method. I tried in lib/ config/initializers and in
environment.rb, but the one in the plugin is always the one that is
run.

Where do I put my version of the method so that it overrides that of
the plugin? I only use this method when running a rake task, so that
may have a bearing on the issue?

Thanks,
Ahmed
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-03-11 15:44
(Received via mailing list)
On Mar 11, 2:03 pm, Daly <aeld...@gmail.com> wrote:
> I am using a plugin that adds a method to ActiveRecord::Base. The
> added method is called self.create_or_update. I need to monkey patch
> this method. I tried in lib/ config/initializers and in
> environment.rb, but the one in the plugin is always the one that is
> run.

Showing us what you've tried would be a useful starting point.

Fred
8d38199a01d2243e313c48456c6ddff9?d=identicon&s=25 zaed (Guest)
on 2009-03-11 20:35
(Received via mailing list)
The plugin is db-populate

in vendor/plugins/db-populate/lib/create_or_update.rb:
class ActiveRecord::Base
  # given a hash of attributes including the ID, look up the record by
ID.
  # If it does not exist, it is created with the rest of the options.
  # If it exists, it is updated with the given options.
  #
  # Raises an exception if the record is invalid to ensure seed data
is loaded correctly.
  #
  # Returns the record.
  def self.create_or_update(options = {})
    id = options.delete(:id)
    record = find_by_id(id) || new
    record.id = id
    record.attributes = options
    record.save!

    record
  end
end

I want to replace it with:
# db-populate monkey patch
# Patched to work even when the primary key != id
require 'active_record'
class ActiveRecord::Base
  # given a hash of attributes including the ID, look up the record by
ID.
  # If it does not exist, it is created with the rest of the options.
  # If it exists, it is updated with the given options.
  #
  # Raises an exception if the record is invalid to ensure seed data
is loaded correctly.
  #
  # Returns the record.
  def self.create_or_update(options = {})
    # Need to get the primary key, can't assume it's always id
    id = options.delete(primary_key.to_sym)

    record = send("find_by_#{primary_key}", id) || new
    record.id = id
    record.attributes = options
    record.save!

    record
  end
end

On Mar 11, 10:43 am, Frederick Cheung <frederick.che...@gmail.com>
Aafa8848c4b764f080b1b31a51eab73d?d=identicon&s=25 Phlip (Guest)
on 2009-03-12 00:56
(Received via mailing list)
Daly wrote:
> I am using a plugin that adds a method to ActiveRecord::Base. The
> added method is called self.create_or_update. I need to monkey patch
> this method. I tried in lib/ config/initializers and in
> environment.rb, but the one in the plugin is always the one that is
> run.
>
> Where do I put my version of the method so that it overrides that of
> the plugin? I only use this method when running a rake task, so that
> may have a bearing on the issue?

Edit the plugin. It's your source.

Submit what you did to its maintainer...
6ef8cb7cd7cd58077f0b57e4fa49a969?d=identicon&s=25 Brian Hogan (Guest)
on 2009-03-12 04:10
(Received via mailing list)
I agree with this. Submit the patch. If he says no, fork the plugin
yourself on github and maintain it. :)
35a7a6e82b3ac6129ab437a4177a98da?d=identicon&s=25 Ranjeet Jones (ranjeetjones)
on 2009-03-12 04:45
Don't monkey patch a monkey patch.
8d38199a01d2243e313c48456c6ddff9?d=identicon&s=25 zaed (Guest)
on 2009-03-12 14:59
(Received via mailing list)
Perfect! Thank you all :)

On Mar 11, 11:45 pm, Ranjeet Jones <rails-mailing-l...@andreas-s.net>
This topic is locked and can not be replied to.