1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

ruby on railsのモデルアソシエーションについて解説

2022-01-03 05:20:18

前置き
モデルの関連付けについて学ぶ前に、以下の点に留意することが重要です。
1。関連付けの関係は、両端が書き込まれるべきである、そうでなければ初心者がエラーを理解することはできませんが存在することになります。そして、それはコードを理解するために非常に良いことです。
2. モデル名は単数形で、コントローラは複数形です。
3. blong_to の後には単数形で小文字を、has_many の後には複数形を付けなければならない。

I: 一対多


マザーズテーブルのidとname
sonsテーブル(idとnameを含む
論理的な関係を増加させるために、主キーと外部キーの関係は、より多くの側になる、列を追加するので、息子テーブルには3つの列、idと名前とmother_id(母親テーブルの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 = ' Xiao Li'


rubyのコードです。

class Mother 
 has_many :sons 
end 

class Son 
 belongs_to :mother 
end



説明します。一人の母に複数の子供がいて、一人の息子は一人の母のものである。
これをrailsのコンソールでテストすると、以下のようになります。
xiao_wang = Son.first 
お母さん = xiaowang.mother。

この .mother メソッドは、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プログラミングの典型です。
1. belongs_to :mother で、railsが判断できるようになる:mothersテーブル、が1つの終点になる。そして、現在のクラスは: "class Son"なので、railsは2つのテーブルがどのように対応しているかを知っています。
2.:class => 'Mother'であることから、対応するモデルクラスはMotherであることがわかります。rails の規約では、Mother モデルはデータベースの mothers テーブルに対応します。
3.:foreign_key => 'mother_id', railsは外部キーが'mother_id'であることを認識しています。そして、一対多の関係では、外部キーは多側に格納されます。(つまり、sonsなので、sonsテーブルには: mother_id というカラムがあるはずです)
というわけで、この複雑なSQL条件を生成する準備が整いました。
上記のrubyのコードは、一度設定すると、次のように呼び出すことができます。

son = Son.first
son.mother # .mother method, which is generated by belongs_to in class Son.
mother = Mother.first
mother.sons # .sons method, generated by hash_many in class Mother.


2:1対1 は、よりシンプルで一般的に使用されていないため、ここでは紹介しない。(夫と妻)

3:多対多


ある学生が、複数の教師を持ち、(複数のコースを受講している場合)
一人の先生が、複数の子供を教えることができる(1つのコースを教えるが、このコースには多くの生徒がやってくる)
しがちです。
学生は、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 = 'Xiao Wang'


Rubyのコードです。

class Student 
 has_many :lessons 
 has_many :teachers, :through => :lessons 
end


ヒント:has_many :teachers, :through => :lessonは以下と同等です。
has_many :teachers, :class => 'Teacher', :foreign_key => 'teacher_id', :throught => :lessons
クラス Teachers 
  has_many :レッスン 
  has_many :students, :through => :lessons 
終了

上の元のSQL文と同じで、王先生が何をもっているか見てみましょう。

Student.find_by_name('Xiao Wang').teachers

今回お伝えしたのは以上ですが、例示されたものは非常にわかりやすいので、ぜひ楽しんでいただければと思います。