Rails 3: fields_for helper doesn't work with association proxy objects

Request for eyeballs. :slight_smile:

Mongoid uses association proxy objects. It overrides #nil? => false when the association is missing. However since it uses proxy objects, !!assocation is always true.

I have created a ticket with a patch that changes the association nil test to call assocation.nil? rather than use implicit coercion of the variable.

See: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4711-patch-rails-3-fields_for-helper-doesnt-work-with-association-proxy-objects

Mongoid uses association proxy objects. It overrides #nil? => false when the association is missing. However since it uses proxy objects, !!assocation is always true.

This is why active record doesn't use proxy objects for nil belongs_to and has_one associations, you can't override the boolean value of your objects.

I have created a ticket with a patch that changes the association nil test to call assocation.nil? rather than use implicit coercion of the variable.

These proxy objects don't follow correct ruby semantics and I'm not entirely sure that we should take the performance hit to work around that bug. There are bound to be other places where we use this form and we're not going to fix all of them.

Understood. I will flip this back to the Mongoid team.

So to clarify, as a matter of implementation, ORMs seeking compatibility with Rails should never use proxy objects for belongs_to or has_one associations?

So to clarify, as a matter of implementation, ORMs seeking compatibility with Rails should never use proxy objects for belongs_to or has_one associations?

It's not really a rails thing, it's people expecting their library to use by ruby developers expecting idiomatic ruby code to work.

if some_object.something

my_thingy = some_object.something || SOME_DEFAULT

These two cases are pretty fundamental, and while the null object pattern is nice and clean, the fact that they can never work right should be a sign it's not a great idea to try it.

Makes sense, thanks.