make members of a has_many share a reference to their belongs_to

Hi all,

I have a model (Foo) with a has_many association to another model (Bar). Each Bar backreferences Foo, and calls a method on Foo that is expensive to call the first time per-instance (Foo#pricey). If all the instances of Bar referenced the same instance of Foo, the cost of calling Foo#pricey would only have to be paid once. Alas, this is not so:

foo = Foo.find :first foo.object_id

=> 70169390687560

foo.bars[0].foo.object_id

=> 70169406714940

foo.bars[1].foo.object_id

=> 70169407605180

I haven't looked into the problem too much, since I thought this was perhaps a simple, common problem for which solution patterns already exist. Are there? Alternatively, can you recommend a good starting point for developing a pattern?

Thanks, Ian

There's certainly not an established solution to this, but there are various experiments such as http://github.com/h-lame/parental_control/tree/master

Fred

Hi all,

I have a model (Foo) with a has_many association to another model (Bar). Each Bar backreferences Foo, and calls a method on Foo that is expensive to call the first time per-instance (Foo#pricey). If all the instances of Bar referenced the same instance of Foo, the cost of calling Foo#pricey would only have to be paid once. Alas, this is not so:

foo = Foo.find :first foo.object_id

=> 70169390687560

foo.bars[0].foo.object_id

=> 70169406714940

foo.bars[1].foo.object_id

=> 70169407605180

I haven't looked into the problem too much, since I thought this was perhaps a simple, common problem for which solution patterns already exist. Are there? Alternatively, can you recommend a good starting point for developing a pattern?

There's certainly not an established solution to this, but there are various experiments such as GitHub - h-lame/parental_control: A plugin for rails that allows has_one, has_many and certain belongs_to associations to share instances of the "parent" model to the "child" model via the association.

Fred

Cool, thanks Fred. Unfortunately the one relationship he doesn't support is belongs_to <-> has_many :frowning: No matter, i solved the problem the old fashioned way by just optimizing the hell out of it. Which is, of course, preferable in many ways. Still, that's some neat code and could well come in handy in other ways.

Thanks again, ISH