ruby on rails中Model的關聯詳解

2022-09-26 05:09:09 字數 2885 閱讀 2402

前言:

在學習model關聯之前,首先要牢記一下幾點:

1.關聯關係,兩端都要寫好,否則會出現初學者看不懂的錯誤。而且對於理解**,非常有好處。

2.model的名字是單數,controller是複數。

3.blong_to後面必須是單數,而且必須是小寫。has_many後面必須是複數。

一:一對多

例如:王媽媽有兩個孩子,小明和小亮。可以說,王媽媽,有多個孩子。也可以說:小明,有乙個媽媽;小王,有乙個媽媽。我們一般在設計表的時候,是這樣設計的:

mothers表中id和name

sons表中有id和name

為了增加邏輯關係,主外來鍵關係,會在多的一方,增加一列,所以sons表中有三列,id和name和mother_id(對應了mothers表的id)

普通sql:

select test_associate.mothers.name from test_associate.mothers inner join test_ass程式設計客棧ociate.sons on sons.mother_id = mothers.id where sons.name = '小李'

ruby**:

class mother

has_many :sons

end

class son

belongs_to :mother

end解釋:乙個媽媽又多個孩子,乙個兒子屬於乙個媽媽。

我們在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.: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_towww.cppcns.com 產生的。

mother = mother.first

mother.sons # .sons 方法, 是由 class mother 中的 hash_many 產生的。

二:一對一,比較簡單,也不常用,這裡不介紹。(老公和老婆)

三:多對多

例如:乙個學生,有多個老師,(學習了多門課程)

乙個老師,可以教多個孩子(教一門課程,但是有好多學生來聽這個課程)

我們往往會這樣做:

students有id和name兩個字段

teachers有id和name兩個字段

放在任何乙個表中都不合適,這是我們需要一張中間表,也就是橋梁表。

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 = xperhqnstudents.id

where students.name = '小王'

ruby**:

class student

has_many :lessons

has_many :teachers, :through => :lessons

end提示:has_many :teachers, www.cppcns.com: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

本文標題: ruby on rails中model的關聯詳解

本文位址:

Ruby on Rails中select使用方法

在ruby on rails中真的有一堆select helper可以用,我們經常容易混淆。常見的有三個.select,select tag,collection select 其餘的什麼select date那些不談 我們先來看看乙個基本的下拉式選項骨架 p select name ror opt...

ruby on rails中建立xml資料

1 安裝builder這個gem gem install builder2 建立xml示例 require builder xml builder xmlmarkup.new target stdout,indent 1 target stdout 引數 指示輸出內容將被寫向標準輸出控制台 inde...

Ruby on rails中相應Ajax請求

rails是我一直認為最好用的框架之一,感覺他的約定大於配置的策略使框架使用起來很人性化,用起來也符合我們一般的習慣。在rails中相應ajax請求是非常方便的,最簡單的在控制器中直接把從資料庫中取出的activerecord用 render json 的方式返回給客戶端就可以了。例如,我們有乙個使...