多 対 多のアソシエーションを実現できるthroughメソッドはよく使用します。
また、has_manyメソッドには他にも次のようなオプションを指定できます。
オプション名 用途
class_name 関連するモデルのクラス名を指定でき、関連名(photos_tags等、has_manyの直後に書くもの)と参照先のクラス名(PhotosTagのようなモデル名)を異なるものにできる。
foreign_key 参照先を参照する外部キーの名前を指定できる(デフォルトは、参照先のモデル名_id)
dependent 親モデルのデータを消したら関連するモデルのデータも連動して消したいときに使用します。destroyとdelete_allでひとつひとつ消していくか、一気に消すかを指定できる
source 関連テーブルから先のモデルにアクセスするための(関連モデルから見た)関連名を指定できる
※has_many :answered_questions, through: :answers, source: :question
sourceオプションは関連テーブル(answers)から先のモデルにアクセスするための関連名を指定しています。今回はanswersテーブルを通し、questionsテーブルの情報を取得しているので:questionを指定しました。
アソシエーションの名前と関連先テーブルが同じ名前の場合、省略することもできます。今回の場合has_many :questionsというアソシエーション名にしてしまえばsourceオプションを書く必要はありません。しかし、それだと User と Question を紐付ける通常の1対多のアソシエーション定義とかぶってしまうのでanswered_questionという違う名前にしました。
「答えた質問」という意味でより分かりやすいですよね。