8

たとえば、

class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  belongs_to :student
end

上記は正しい使用法であるはずですが、使用するとどうなりますか

class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  has_one :student
end

student.awards上記は Award オブジェクトの配列としても、賞の受賞者である Student オブジェクトとしても可能ではないaward.studentので、投稿の上部にあるメソッドと同じように機能しますか?

4

2 に答える 2

8

has_one1 対多の関係ではなく、1 対 1 の関係の場合に使用されます。

の正しい使用has_one:

class Student < ActiveRecord::Base
  has_one :id_card
end

class IdCard < ActiveRecord::Base
  belongs_to :student
end
于 2010-09-15T03:05:43.927 に答える
3

2 つの例は同等ではありません。

has_manybelongs_to「多対1」の関係があるペアとして機能します。

データベースでは、これは次のようになります。

**Students**
Name
Email
...

**Awards**
Name
student_id  <-- !IMPORTANT!
...

それぞれStudentが多くの賞をhas_many :awards 持っAwardStudentいる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」の関係があり、適用されるテーブルに外部キーがない場合にのみ使用されます。

于 2015-02-10T15:04:01.470 に答える