在正常的表設計的時候不會發現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,都是立即載入,會額外傳送一條查詢語句。原因是,含有外來鍵的一方可以根據外來鍵判斷是否為...