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.