Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative method for proxy_owner in ActiveRecord

ActiveRecord proxy_owner is now deprecated and the explanation here is very vague on how to change it, so I'm not sure how to use it my case: http://apidock.com/rails/ActiveRecord/Associations/AssociationProxy

Here is what I'm trying to do:

class Library < ActiveRecord::Base
  has_many :books do
    def some_method
      proxy_owner.author
    end
  end
end

I get a warning when I run this code that proxy_owner is deprecated:

DEPRECATION WARNING: Calling record.books.proxy_owner is deprecated. Please use record.association(:books).owner instead.

I can replace proxy_owner.author with:

@associaton.owner.author

This works; however, it seems dangerous. Am I missing something here?

like image 940
Jeff Avatar asked Dec 02 '22 01:12

Jeff


1 Answers

I think it's safer to send :owner to proxy_association instead:

class Library < ActiveRecord::Base
  has_many :books do
    def some_method
      proxy_association.owner.author
    end
  end
end

The use of proxy_association is now mentioned in the documentation:

However, inside the actual extension code, you will not have access to the record (record.association(:items).owner) as above. In this case, you can access proxy_association. For example, record.association(:items) and record.items.proxy_association will return the same object, allowing you to make calls like proxy_association.owner inside association extensions.

like image 56
Dave Nolan Avatar answered Dec 29 '22 00:12

Dave Nolan