對ROR的一對一關係的理解

2021-09-01 03:53:52 字數 1424 閱讀 4213

在正常的表設計的時候不會發現model引入一對一關係有邏輯問題,但要是遇上不正常的表設計,則要注意處理好model層的一對一關係.

1個使用者擁有乙個聯絡資訊

user <--------------- 1:1---------------> contact

一對一的表設計可以把外來鍵關係放在任意乙個表.

create_table(:users) do |t| # cloumns end

create_table(:contacts) do |t| t.reference :user end

對應model設定一對一關係

class user < activerecord::base has_one :contact end

class user < activerecord::base belongs_to :user # columns end

create_table(:users) do |t| t.reference :contact # columns end

create_table(:contacts) do |t| # columns end

對應model設定一對一關係

class user < activerecord::base belongs_to :contact end

class user < activerecord::base has_one :user end

觀察case1 和 case 2, 可以發現,case1比較正常,表達了user為主表,contact為子表的關係.

然而事實上我們有些情況會將外來鍵關係放在user表上,即case2的情況,而case的model裡,卻反映的是user表是contact表的乙個子表,邏輯上會很奇怪.

這個實際反映出rails中的has_one和belongs_to兩個方法的一些trick, 反映出ruby在引用這兩個函式時的一些潛歸則.

這也是對的,資料表設計時本來就沒有按正常的邏輯來設計表的外來鍵關係(r),就必須遵遁ror的函式規則.

stackoverflow也講到這一點了:

class person < activerecord::base has_one :cell # the cell table has a person_id end class cell < activerecord::base has_one :person # the person table has a cell_id end

class person < activerecord::base belongs_to :cell # the person table has a cell_id end class cell < activerecord::base belongs_to :person # the cell table has a person_id end

所以要特別注意一下.

一對一關係

1 共享主鍵方式 共享主鍵方式就是限制兩個資料表的主鍵使用相同的值,通過主鍵形成一對一的對映關係。如 學員的登入帳號資訊和學員的詳細分別存放到兩張不同的表中。表 持久化類 public class student public class stupwd student.hbm.xml cascade...

一對一關係對映

主鍵關聯 兩個關聯的實體在表中具有相同的主鍵值,這個主鍵可只由其中乙個表生成,在另外乙個表中通過對映檔案中使用主鍵的foreign生成機制引用已經生成的主鍵值。student類 public class student public void setcard card card public stu...

一對一關係對映

兩端都需要配置 onetoone,但需要對映外來鍵維護關係的一端,額外新增 joincolumn 屬性。含有主鍵的一方預設是立即載入機制,但可以通過fetch 屬性調整,但是沒有主鍵的一端,無論如何更改fetch,都是立即載入,會額外傳送一條查詢語句。原因是,含有外來鍵的一方可以根據外來鍵判斷是否為...