Forum: Ruby on Rails Completely override has_many accessor

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Chris (Guest)
on 2009-04-17 14:28
(Received via mailing list)
Hi,

I have an unusual use-case where I need to override a has_many
accessor to return an array of results depending on some the value of
a class variable. I've tried several solutions, the closest to success
using the extension option:

[code]
has_many :meta_associations, :as => :meta_extendable do
          # Find any meta_associations that are joined to this
activerecord instance
          def meta_associations(*args)
            options = args.extract_options!

            if proxy_owner.class.applicable_type ==
proxy_owner.class.name
              options[:conditions] ||= { :meta_extendable_id =>
proxy_owner.id,
                                         :meta_extendable_type =>
proxy_owner.class.applicable_type }
            else
              options[:conditions] ||= { :meta_extendable_id =>
proxy_owner.send
(proxy_owner.class.applicable_type_foreign_key.to_sym),
                                         :meta_extendable_type =>
proxy_owner.class.applicable_type }
            end

            MetaAssociation.find(args.first, options)
          end

        end
[/code]

However, this just gives me an
instance.meta_associations.meta_associations method, rather than
overriding the default instance.meta_associations. Is this possible,
or should I forget using :has_many and manually write all the
collection accessors/mutators?

Thanks,
Chris
--
www.chrisblunt.com
Frederick C. (Guest)
on 2009-04-17 16:24
(Received via mailing list)
On 17 Apr 2009, at 11:27, Chris wrote:
>
>
> However, this just gives me an
> instance.meta_associations.meta_associations method, rather than
> overriding the default instance.meta_associations. Is this possible,
> or should I forget using :has_many and manually write all the
> collection accessors/mutators?
>
Well you cannot overwrite the instance.meta_associations method like
that (since you're adding method to the associations proxy, but
foo.meta_associations  just returns that proxy).

You may get some mileage out of overwriting the methods that actually
load the association (find_target, the method that generates the scope
used for other operations etc)

Fred
Chris (Guest)
on 2009-04-18 19:10
(Received via mailing list)
Hi Fred,

Thanks for your reply. I tried overriding the methods directly, but
they seem to be ignored by AR and the association proxy takes
precedence over my implementation. However, I've looked over my code
and am going to try a different approach than trying to override the
original accessors for now; I'll post back how I get on.

Thanks,
Chris

On Apr 17, 1:23 pm, Frederick C. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.