While searching some documentation about has_many :through I’ve found Josh Susser’s blog called (very imaginatively) “has_many :through” and the article about Magic join model creation in Rails Edge.
It is about using << on has_many through associations, before that you could use them only on habtm.
The article is quite old, 19 August 2006, and Rails has changed a bit since then, with_scope is now protected so now instead of
Contribution.with_scope(:create => join_attrs) { self << book }
use
Contribution.send(:with_scope, :create => join_attrs) { self << book }
For more information about many-to-many associations also see Many-to-many Dance-off in which habtm and has_many through is compared and Rails documentation.