ruby on railsにおけるModelの関連詳細
3149 ワード
前言:model関連を学ぶ前に、まずいくつかの点を覚えておきます:1.関連関係は、両端を書きます.そうしないと、初心者には分からない間違いが発生します.また、コードを理解するのに非常にメリットがあります.2.modelの名前は単数、controllerは複数です.3.blong_toの後ろは単数で、小文字でなければなりません.has_manyの後ろは複数でなければなりません.
一:一対多
例えば、王さんのお母さんには子供が二人います.明さんと亮さんです.王さんのお母さん、子供がたくさんいます.明ちゃん、お母さんがいます.王さん、お母さんがいます.私たちは一般的にテーブルを設計する際に、mothersテーブルのidとname sonsテーブルにidとnameがある論理関係を増やすために、主外部キー関係は、複数の側で、1列増加するので、sonsテーブルには3列、idとnameとmother_id(mothersテーブルに対応するid)通常SQL:
rubyコード:
1人のお母さんはまた多くの子供で、1人の息子は1人のお母さんに属します.rails consoleでテストできます:xiao_wang = Son.first mom = xiaowang.mother
これMotherメソッドはclass Sonのbelongs_to:motherという言葉が生成されました.つまり、変換したsql文に相当します.
詳細:
A:belongs_to :mother B:belongs_to :mother, :class => 'Mother', :foreign_key => 'mother_id' A=B
これがRailsの最も典型的な慣例に基づいてプログラミングされ、どのテーブルがどのclassに対応しているかを宣言し、class間で関連関係を宣言します.1.belongs_to:mother,railsはmothers表が,一つの端であると判断できる.現在のclassは「class Son」であり、railsは2つのテーブルの対応関係を知っています.2.:class=>'Mother'は、一つの端を表し、対応するmodel classはMotherである.railsの慣例によれば、Mother modelはデータベース内のmothersテーブルに対応している.3.:foreign_key => 'mother_id',railsは知っています.外部キーは'mother_です.id'. 一方、一対の多関係では、外部キーは複数の端(すなわちsonsであるため、sonsテーブルには、mother_idという列が必要である)に保存されるため、この複雑なSQL条件がそろって生成される.上のrubyコードは、構成後、このように呼び出すことができます.
二:一対一で、簡単で、よく使われません.ここでは紹介しません.(旦那と女房)
三:多対多
例えば、1人の学生、複数の先生、(複数の授業を勉強した)1人の先生は、複数の子供を教えることができます(1つの授業を教えることができますが、多くの学生がこの授業を聞くことができます)私たちはよくこのようにします:studentsにはidとnameの2つのフィールドteachersがあり、idとnameの2つのフィールドがどの表に置いても適切ではありません.これは中間表が必要です.つまり橋梁時計です.lessonsにはidとnameとstudentがありますidとteacher_id元のSQL:
Rubyコード:
ヒント:has_many:teachers,:through=>:lessonsはhas_に相当many :teachers, :class => 'Teacher', :foreign_key => 'teacher_id', :throught => :lessons class Teachers has_many :lessons has_many :students, :through => :lessons end
王さんの先生がどれらがあるかを見て、上の元のSQL文と同じです.
以上が本文で皆さんに共有したすべての内容で、与えられた例もとても分かりやすくて、みんなが好きになることを望んでいます.
一:一対多
例えば、王さんのお母さんには子供が二人います.明さんと亮さんです.王さんのお母さん、子供がたくさんいます.明ちゃん、お母さんがいます.王さん、お母さんがいます.私たちは一般的にテーブルを設計する際に、mothersテーブルのidとname sonsテーブルにidとnameがある論理関係を増やすために、主外部キー関係は、複数の側で、1列増加するので、sonsテーブルには3列、idとnameとmother_id(mothersテーブルに対応するid)通常SQL:
select test_associate.mothers.name from test_associate.mothers inner join test_associate.sons on sons.mother_id = mothers.id where sons.name = ' '
rubyコード:
class Mother
has_many :sons
end
class Son
belongs_to :mother
end
1人のお母さんはまた多くの子供で、1人の息子は1人のお母さんに属します.rails consoleでテストできます:xiao_wang = Son.first mom = xiaowang.mother
これMotherメソッドはclass Sonのbelongs_to:motherという言葉が生成されました.つまり、変換したsql文に相当します.
select * from mothers
join sons
on sons.mother_id = mothers.id
where sons.id = 1
詳細:
A:belongs_to :mother B:belongs_to :mother, :class => 'Mother', :foreign_key => 'mother_id' A=B
これがRailsの最も典型的な慣例に基づいてプログラミングされ、どのテーブルがどのclassに対応しているかを宣言し、class間で関連関係を宣言します.1.belongs_to:mother,railsはmothers表が,一つの端であると判断できる.現在のclassは「class Son」であり、railsは2つのテーブルの対応関係を知っています.2.:class=>'Mother'は、一つの端を表し、対応するmodel classはMotherである.railsの慣例によれば、Mother modelはデータベース内のmothersテーブルに対応している.3.:foreign_key => 'mother_id',railsは知っています.外部キーは'mother_です.id'. 一方、一対の多関係では、外部キーは複数の端(すなわちsonsであるため、sonsテーブルには、mother_idという列が必要である)に保存されるため、この複雑なSQL条件がそろって生成される.上のrubyコードは、構成後、このように呼び出すことができます.
son = Son.first
son.mother # .mother , class Son belongs_to 。
mother = Mother.first
mother.sons # .sons , class Mother hash_many 。
二:一対一で、簡単で、よく使われません.ここでは紹介しません.(旦那と女房)
三:多対多
例えば、1人の学生、複数の先生、(複数の授業を勉強した)1人の先生は、複数の子供を教えることができます(1つの授業を教えることができますが、多くの学生がこの授業を聞くことができます)私たちはよくこのようにします:studentsにはidとnameの2つのフィールドteachersがあり、idとnameの2つのフィールドがどの表に置いても適切ではありません.これは中間表が必要です.つまり橋梁時計です.lessonsにはidとnameとstudentがありますidとteacher_id元のSQL:
select teachers.*, students.*, lessons.*
from lessons from teachers ,
join teachers
on lessons.teacher_id = teachers.id
join students
on lessons.student_id = students.id
where students.name = ' '
Rubyコード:
class Student
has_many :lessons
has_many :teachers, :through => :lessons
end
ヒント:has_many:teachers,:through=>:lessonsはhas_に相当many :teachers, :class => 'Teacher', :foreign_key => 'teacher_id', :throught => :lessons class Teachers has_many :lessons has_many :students, :through => :lessons end
王さんの先生がどれらがあるかを見て、上の元のSQL文と同じです.
Student.find_by_name(' ').teachers
以上が本文で皆さんに共有したすべての内容で、与えられた例もとても分かりやすくて、みんなが好きになることを望んでいます.