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.
Daly (Guest)
on 2009-03-11 16: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
Frederick C. (Guest)
on 2009-03-11 16:44
(Received via mailing list)
On Mar 11, 2:03 pm, Daly <removed_email_address@domain.invalid> 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
zaed (Guest)
on 2009-03-11 21: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 C. <removed_email_address@domain.invalid>
Phlip (Guest)
on 2009-03-12 01: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...
Brian H. (Guest)
on 2009-03-12 05: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. :)
Ranjeet J. (Guest)
on 2009-03-12 05:45
Don't monkey patch a monkey patch.
zaed (Guest)
on 2009-03-12 15:59
(Received via mailing list)
Perfect! Thank you all :)

On Mar 11, 11:45 pm, Ranjeet J. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.