Monkey Patching a Plugin


#1

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


#2

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


#3

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…


#4

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


#5

I agree with this. Submit the patch. If he says no, fork the plugin
yourself on github and maintain it. :slight_smile:


#6

Don’t monkey patch a monkey patch.


#7

Perfect! Thank you all :slight_smile:

On Mar 11, 11:45 pm, Ranjeet J. removed_email_address@domain.invalid