ruby on railsのモデルアソシエーションについて解説
前置き
モデルの関連付けについて学ぶ前に、以下の点に留意することが重要です。
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
今回お伝えしたのは以上ですが、例示されたものは非常にわかりやすいので、ぜひ楽しんでいただければと思います。
関連
-
RVMを使ってRuby/Railsのバージョン切り替えを制御する
-
画像フィルターアルゴリズムコードのRuby実装
-
RubyとRuby on Railsフレームワーク環境構築の簡潔なチュートリアル
-
Rubyのデザインパターン開発におけるProxyパターンの利用について
-
Ruby+Watirの自動テスト環境とWindowsでのデータ読み込みについて
-
Ruby on RailsでPing ++プラットフォームでの決済を実現
-
Ruby on Railsのパフォーマンスを最適化するためのいくつかの方法についての考察
-
ブログのスパムメッセージを簡単にブロックする方法
-
Ruby WebDriverガイド
-
Rubyプログラミングにおけるアサインメント関連操作
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Ruby on rails install to remove DL is deprecated, please use Fiddle warning message method [test available].
-
Luhnアルゴリズムの学習とそのRuby実装コード例
-
Rubyのブロック機能をより深く理解するために
-
Rubyの並列処理とグローバルロック
-
Rubyオブジェクト指向の知識まとめ
-
RubyでXMLデータ処理ライブラリREXMLを使うための手引き
-
Rubyのデザインパターン開発におけるobserverパターンの一例
-
文字列のマッチングと置換のためのRuby正規表現
-
Ruby on Railsの基礎 - 新規プロジェクト
-
Ruby on Railsのjquery_ujsコンポーネントが遅くなる問題が解決された