public
Description: rails plugin that allows has_many :through to go through other has_many :throughs
Homepage:
Clone URL: git://github.com/ianwhite/nested_has_many_through.git
commit  80c43d8cfb18c730b9985347a3abfe60bcb9b51e
tree    6fb7ccf8505702ec5594c0e5534bd95c351234d3
parent  f1da64b7ff13d2f5ecaf49181f8c1945ece67b97
name age message
file .gitignore Thu Jun 05 14:12:33 -0700 2008 Ignoring garlic dir [ianwhite]
file CHANGELOG Wed Apr 30 05:13:47 -0700 2008 ch ch ch changes [ianwhite]
file MIT-LICENSE Mon Apr 28 05:57:58 -0700 2008 Initial commit [ianwhite]
file README Loading commit data...
file README.rdoc
file Rakefile
file SPECDOC Wed Apr 30 05:04:06 -0700 2008 Updated SPECDOC with edge specs [ianwhite]
file TODO Mon Apr 28 15:56:25 -0700 2008 Added TODO, SPECDOC Added more specs Decreased ... [ianwhite]
file garlic_example.rb
file init.rb Tue Oct 07 16:42:48 -0700 2008 Added branching BC code for AssociationReflecti... [ianwhite]
directory lib/ Wed Apr 30 05:00:39 -0700 2008 Fixed failing named_scope specs [ianwhite]
directory spec/ Wed Apr 30 05:09:37 -0700 2008 Fixed spec that failed in 2.0-stable and 2.0.2 ... [ianwhite]
README.rdoc

plugins.ardes.com > nested_has_many_through

nested_has_many_through

A fantastic patch/plugin has been floating around for a while:

obrie made the original ticket and Matt Westcott released the first version of the plugin, under the MIT license. Many others have contributed, see the trac ticket for details.

Here is a refactored version (I didn’t write the original), suitable for edge/2.0-stable with a bunch of acceptance specs. I’m concentrating on plugin usage, once it becomes stable, and well enough speced/understood, then it’s time to pester rails-core.

Why republish this on github?

  • The previous implementations are very poorly speced/tested, so it’s pretty hard to refactor and understand this complicated bit of sql-fu, especially when you’re aiming at a moving target (edge)
  • the lastest patches don’t apply on edge
  • github - let’s collab to make this better and get a patch accepted, fork away!

Help out

I’m releasing ‘early and often’ in the hope that people will use it and find bugs/problems. Report them at ianwhite.lighthouseapp.com, or fork and pull request, yada yada.

History

Here’s the original description:

  This plugin makes it possible to define has_many :through relationships that
  go through other has_many :through relationships, possibly through an
  arbitrarily deep hierarchy. This allows associations across any number of
  tables to be constructed, without having to resort to find_by_sql (which isn't
  a suitable solution if you need to do eager loading through :include as well).

Contributors

  • Matt Westcott
  • terceiro
  • shoe
  • mhoroschun
  • Ian White

Get in touch if you should be on this list

Show me the money!

Here’s some models from the specs:

  class Author < User
    has_many :posts
    has_many :categories, :through => :posts, :uniq => true
    has_many :similar_posts, :through => :categories, :source => :posts
    has_many :similar_authors, :through => :similar_posts, :source => :author, :uniq => true
    has_many :posts_of_similar_authors, :through => :similar_authors, :source => :posts, :uniq => true
    has_many :commenters, :through => :posts, :uniq => true
  end

  class Post < ActiveRecord::Base
    belongs_to :author
    belongs_to :category
    has_many :comments
    has_many :commenters, :through => :comments, :source => :user, :uniq => true
  end

The first two has_manys of Author are plain vanilla, the last four are what this plugin enables

  # has_many through a has_many :through
  has_many :similar_posts, :through => :categories, :source => :posts

  # doubly nested has_many :through
  has_many :similar_authors, :through => :similar_posts, :source => :author, :uniq => true

  # whoah!
  has_many :posts_of_similar_authors, :through => :similar_authors, :source => :posts, :uniq => true

  # has_many through a has_many :through in another model
  has_many :commenters, :through => :posts, :uniq => true

What does it run on?

Currently it’s running on edge, 2.0-stable and 2.1-stable

If you want to run the CI suite, then check out garlic_example.rb (The CI suite is being cooked with garlic - git://github.com/ianwhite/garlic)