I am working with extensions to has_many associations, and I want to create a finder method that is conditional on the attributes of the object whose association I''m working with. So, to use the example from the Agile Web Development: the authors show on pg 340 in the second edition how to pass an argument to a finder method. But I want to know if it''s possible to instead have the finder method look at attributes of the object on which the finder method is ultimately being executed (here, user) to determine the conditions. class User has_many :reading has_many :articles, :through => :readings do def rated_at_or_above(rating) # this is the finder method in AWD -- works fine find :all, :conditions => [''rating >= ?'', rating] end def rated_at_or_above_threshold # but can I do something like this? (doesn''t work) find :all, :conditions => [''rating >= ?'', user.threshold] # NoMethodError: undefined method user for Article:class end end end How would I implement this? As the error suggests, the problem is that the article doesn''t know who its user is. So how can I pass that information to this method, given that it''s nested inside of this association? Thanks. (Btw, I tried to post this yesterday but it has not appeared, and another msg suggested that posts made from the Google Groups page get lost sometimes -- sorry if this is double-posted.) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Andy Eggers wrote:> class User > > has_many :reading > has_many :articles, :through => :readings do > def rated_at_or_above(rating) # this is the finder > method in AWD -- works fine > find :all, :conditions => [''rating >= ?'', rating] > end > def rated_at_or_above_threshold # but can I do > something > like this? (doesn''t work) > find :all, :conditions => [''rating >= ?'', user.threshold] # > NoMethodError: undefined method user for Article:class > end > end > end > > How would I implement this? As the error suggests, the problem is that > the > article doesn''t know who its user is. So how can I pass that information > to > this method, given that it''s nested inside of this association?The code in an association extension is executed in the context of the AssociationProxy object, not the ActiveRecord model. Simply put, that means that "self" in the extension isn''t the user, it''s the has_many proxy. But proxy_owner points to the user, so you can do `proxy_owner.threshold` to get the user''s threshold. -- Josh Susser http://blog.hasmanythrough.com/ -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Seemingly Similar Threads
- Rails, respond_to? over anonymous module (extend has_many).
- will_paginate plugin doesn't work with Association Extensions?
- Overwriting / Decorating ActiveRecord association accessor
- marshaling ActiveRecord objects: how to unload associations?
- Association extension method