これもいつも忘れてしまうのですが、
たとえば、とあるブログサービスで
Member : 会員
Article : ブログ記事
という2つのモデルがあり、
ここにできれば記事ごとに会員を関連付けて、その記事の「読者」という形でデータを持たせたいと思った場合は、中間テーブルを使用すると思うのですが、Railsの場合はこんな感じでやります。
 
中間テーブルのモデルとして、ArticlesMember モデルを定義します。
※別に名前はこれじゃなくてもいいのですがRailsの規約に従ってそうしました。
 
基本的にこいつはMemberとArticleのIDを持つ中間テーブルです。
※中間テーブルのために新しいモデルを定義する必要があるのか? と思うかもしれませんが、ここに例えば、記事に対する読者の評価(よくある星マークみたいなヤツ)とか他の属性も持たせたくなるケースもよくあると思います。そうするとやっぱりモデルとして持たせるのは正解だと思います。
 
それぞれのモデルは多分こんな感じ。
has_manyとthroughを使います。 
# 読者は会員と記事に属している
class ArticlesMember < ActiveRecord
  belongs_to :member
  belongs_to :article
end

#会員は中間テーブル readers(Readerモデル)を通して読者になっている記事情報(Articleモデル)を持っている
class Member < ActiveRecord
  has_many :articles_members
  has_many :articles, :through => :articles_members, 
end

# 記事は同じく 中間テーブル articles_members(ArticlesMemberモデルを通して会員データ(Memberモデル)を持っている
class Article < ActiveRecord
  has_many :articles_members
  has_many :members, :through => :articles_members
end
これで簡単に記事データから読者としての会員情報にアクセス出来ます。 こんな感じ。
# とある記事の全読者のフルネームを表示
article = Article.find(1)
article.members.each do |member|
  p "この記事の読者は #{member.full_name} さんです"
end
article.members という名前で読者情報にアクセスしていますが、それは単に読者=会員=Memberモデルだから、members という名前になっているだけです。 これをもっと直感的に readers(読者なんだから)としたい場合は、 source オプションを使用すればOKです。
class Article < ActiveRecord
  has_many :articles_members
  has_many :readers, :through => :articles_members, :source => :member
end

#すると、同じように、

article = Article.find(1)
article.readers.each do |reader|
  p "この記事の読者は #{reader.full_name} さんです"
end
こんな感じになります。
もう忘れないでしょ。