前言:
在學習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 的方式返回給客戶端就可以了。例如,我們有乙個使...