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:

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

以上が本文で皆さんに共有したすべての内容で、与えられた例もとても分かりやすくて、みんなが好きになることを望んでいます.