It is often the case when I iterate over an array of objects in a
has_many_through association that I want access to both the :has_many
objects and the :through objects. There is generally something in
that join object that is useful to get at, but enumerating with the
each method, I don't have easy access to that join object.
Example:
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, :through => :memberships
end
# ugly way
user.groups.each do |group|
membership = user.memberships.detect { |memberships|
memberships.group_id == group.id}
# or
membership = user.memberships.find(:first, :conditions =>
["memberships.group_id = ?", group.id]}
puts "#{group.name}, #{membership.status}"
end
# a better way
user.groups.each_with_join do |group, membership|
puts "#{group.name}, #{membership.status}"
end
I created a ticket with a patch (tested) in lighthouse:
http://rails.lighthouseapp.com/projects/8994/ticke...
Let me know what you think!
Daniel
on 2008-05-01 18:43
on 2008-05-01 18:51
I was hoping this ticket could be resolved in time for 2.1, it's complete with tests that show the failure. http://dev.rubyonrails.org/ticket/11565
on 2008-05-01 19:01
But your ticket has nothing to do with the one I was proposing, so let's not lump them together.
on 2008-05-01 22:10
On Fri, May 2, 2008 at 4:42 AM, danlunde <danlunde@gmail.com> wrote: > has_many :memberships > puts "#{group.name}, #{membership.status}" > end > > # a better way > user.groups.each_with_join do |group, membership| > puts "#{group.name}, #{membership.status}" > end This should really just be: user.memberships.each do |membership| puts membership.status, membership.group.name end So I can't the need for this feature. > > I created a ticket with a patch (tested) in lighthouse: > http://rails.lighthouseapp.com/projects/8994/ticke... > > Let me know what you think! > > Daniel > > > -- Cheers Koz