I've been adding logging to this to try and figure out what is going on. I think part of the problem is that the might_have seems to cover might_have_one and might_have_many. I suspect that it would work fine for might_have_many, but in my use case, a user will only ever have one money.user_summary. I'll need to test with a might_have that may have multiple rows to see what happens there. So I wonder if there shouldn't be more relations types? In Event.pm, the multi flag gets set for anthing other than has_a relations. So the user_summary gets grabbed as an array of objects. Then there is a line that says if the relation is might_have, then take the first object in the array and use that. The first time it runs it works fine, then the next time it runs, it grabs the first field in the object instead of the first object in an array. What seems to work so far is to check to see if it is an array of objects before grabbing the first one. $obj = $$obj[0] if $rtype eq 'might_have' and ref($obj) eq 'ARRAY'; vs $obj = $$obj[0] if $rtype eq 'might_have'; Logs of original behavior. So this is the second time the user.money_summary path gets processed for one bill, so the object has already been retrieved and is in the cache. [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:503:] Running _object_by_path [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:626:] _object_by_path(): meth=retrieve_actor_user, obj=185040, multi=0, step=usr, lfield=usr [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:651:] _object_by_path() after fetch or cache: obj=Fieldmapper::actor::u ser=ARRAY(0x5d5eb98), lval=185040, ffield=id, step=usr, fhint=au, str_path=money_summary, def_id=118 [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:659:] _object_by_path(): @$path code block [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:669:] _object_by_path(): @$path code block - call by path again [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:626:] _object_by_path(): meth=search_money_user_summary, obj=Fieldmapper::money::user_summary=ARRAY(0x5d85b08), multi=1, step=money_summary, lfield=id [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:709:] _object_by_path(): Before Might Have: $VAR1 = bless( [ '200.00', '200.00', '0.0', 185040 ], 'Fieldmapper::money::user_summary' ); [2019-03-05 10:55:01] open-ils.trigger [DEBG:18699:Event.pm:714:] _object_by_path() Might have: obj=200.00, objdump=$VAR1 = '200.00'; So the code "$obj = $$obj[0] if $rtype eq 'might_have';" grabs the first element of the results and sents that as the object, in this case '200.00'. After adding "$obj = $$obj[0] if $rtype eq 'might_have' and ref($obj) eq 'ARRAY';" I see this behavior. [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:503:] Running _object_by_path [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:626:] _object_by_path(): meth=retrieve_actor_user, obj=185040, multi=0, step=usr, lfield=usr [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:651:] _object_by_path() after fetch or cache: obj=Fieldmapper::actor::u ser=ARRAY(0x3ee6488), lval=185040, ffield=id, step=usr, fhint=au, str_path=money_summary, def_id=118 [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:659:] _object_by_path(): @$path code block [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:669:] _object_by_path(): @$path code block - call by path again [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:626:] _object_by_path(): meth=search_money_user_summary, obj=Fieldmapper::money::user_summary=ARRAY(0x42c9e30), multi=1, step=money_summary, lfield=id [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:709:] _object_by_path(): Before Might Have: $VAR1 = bless( [ '200.00', '200.00', '0.0', 185040 ], 'Fieldmapper::money::user_summary' ); [2019-03-05 11:04:13] open-ils.trigger [DEBG:18984:Event.pm:714:] _object_by_path() Might have: obj=Fieldmapper::money::user_summary=ARRAY(0x42c9e30), objdump=$VAR1 = bless( [ '200.00', '200.00', '0.0', 185040 ], 'Fieldmapper::money::user_summary' ); So because $obj isn't an array, it doesn't get re-written. I would really appreciate it if someone else could take a look at this and tell me what you think. Thanks Josh