2 つの例は同等ではありません。
has_many
belongs_to
「多対1」の関係があるペアとして機能します。
データベースでは、これは次のようになります。
**Students**
Name
Email
...
**Awards**
Name
student_id <-- !IMPORTANT!
...
それぞれStudent
が多くの賞をhas_many :awards
持っAward
てStudent
いるbelongs_to :student
belongs_to
が外部キーを持つテーブルに適用されることに注意してくださいstudent_id
。これは重要。
では、「1 対 1」の関係がある場合はどうなるでしょうか。
各学生が 1 つの賞しか得られない場合、データベース テーブルはまったく同じように見えますが、モデルは項目のコレクションを返すことができないはずです。
has_one
ここで宣言が必要になります。Student
これは、この場合のモデルに適用されます。なんで?関係は両方向で同じですが、Active Record は外部キーの場所を知る必要があるためです。
データベース テーブルが逆で、それぞれStudent
が を持っているaward_id
場合、Student
は を取得しbelongs_to
、 はAward
を取得しhas_one
ます。
それが明確になることを願っていますか?
自然言語を使えば、学生が賞に「所属」できるというのは少し奇妙に思えます。しかし、これが Rails のアクティブ レコード ドメイン固有言語の記述方法です。
「has_many_and_belongs_to」との「多対多」の関係を見ると、さらに不自然に聞こえます。ここに、メインテーブル間のサイトのような結合テーブルがあります
students_awards
student_id
award_id
この状況Students
では、テーブルにもAwards
テーブルにも外部キーはありませんが、両方ともhas_many_and_belongs_to :other_table
宣言を保持します。両方のテーブルは、他のテーブルの複数の行に結合できます。それぞれStudent
に複数の を含めることができますAward
。それぞれAward
が多くの に適用できますStudents
。
has_one
宣言は、「1 対 1」の関係があり、適用されるテーブルに外部キーがない場合にのみ使用されます。