Wait a min..
some_author.posts.each {|p| puts p.author.name}
p.author.name == some_author.name !
On 8/7/07, paccator <[EMAIL PROTECTED]> wrote:
>
> Why has_many doesn't set target for objects in its collection?
>
> E.g. when
>
> class Author < ActiveRecord; has_many :posts; end
> class Post < ActiveRecord; belongs_to :author; end
>
> then
>
> some_author.posts.each {|p| puts p.author.name}
>
> will require additional queries to fetch author for each post.
>
>
> Could some option to has_many be added to pre-fill the target (in this
> case set_author_target for each post)?
>
>
>
> Something like:
>
> module ActiveRecord
> module Associations # :nodoc:
> module ClassMethods
>
> # When called with <tt>:fill_target => name</tt> it will fill
> targets in each object in association
> # E.g.: when Author <tt>has_many :posts, :fill_target =>
> "author"</tt>
> # then <tt>some_author.posts.each {|m| m.author.name }</tt> will
> not require aditional db queries to fetch author for each post
> # (it will use the +some_author+ already from memory)
> #
> # Two methods are created additionally, for the example above it
> will be +posts_with_author+ and +posts_without_author+,
> # where just +posts+ is the same as +posts_with_author+
>
> def has_many_with_fill_target(association_id, options = {},
> &extension)
> fill_target = options.delete(:fill_target)
> has_many_without_fill_target(association_id, options,
> &extension)
>
> if fill_target
> module_eval do
> define_method("#{association_id}_with_#{fill_target}") do |
> *args|
>
> returning( send("#{association_id}_without_#{fill_target}", *args) ) {|
> p| p.each {|m| m.send("set_#{fill_target}_target", self) } }
> end
> alias_method_chain association_id, fill_target
> end
> end
> end
>
> alias_method_chain :has_many, :fill_target
>
> end
> end
> end
>
>
> >
>
--
Cheers!
- Pratik
http://m.onkey.org
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Core" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---