简体   繁体   中英

Monkey patching a db model class in Rails with Mongoid causes weird behaviour

I am using a development script file to check out new possible ideas. Recently I tried to monkey patch MyDBObject from within that script file. Assume an empty dev.rb file and add a monkey patch right in the top like so:

class MyDBObject
  def test_function
    'function works'
  end
end

Starting up the pry console and loading the file yields random results. First I received:

NoMethodError: undefined method `relations' for MyDBObject:Class

Later the script loaded, but I couldn't access the original class any longer:

undefined method `first' for MyDBObject:Class

I noticed that prepending the line:

MyDBObject

right before the monkey patching, the intended functionality is achieved. This appears to be some sort of lazy loading of the class objects. Can somebody cast some light on this for me please?

Depending on the order in which source files are loaded, you'll either be redefining the entire class, or having your changes replaced.

I highly recommend giving this a read: http://www.justinweiss.com/articles/3-ways-to-monkey-patch-without-making-a-mess/ (TLDR - put your patch in a module and explicitly include it)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM