Rails 支持六種關(guān)聯(lián)?
belongs_to?關(guān)聯(lián)
? ??????belongs_to?關(guān)聯(lián)創(chuàng)建兩個模型之間一對一的關(guān)系叁执,聲明所在的模型實例屬于另一個模型的實例。例如次哈,如果應(yīng)用中有作者和圖書兩個模型吆录,而且每本書只能指定給一位作者,就要這么聲明圖書模型:
has_one?關(guān)聯(lián)
????????has_one?關(guān)聯(lián)也建立兩個模型之間的一對一關(guān)系哀卫,但語義和結(jié)果有點不一樣滋恬。這種關(guān)聯(lián)表示模型的實例包含或擁有另一個模型的實例。例如,應(yīng)用中每個供應(yīng)商只有一個賬戶鼓寺,可以這么定義供應(yīng)商模型:
????????根據(jù)使用需要妈候,可能還要為 accounts 表中的 supplier 列創(chuàng)建唯一性索引和(或)外鍵約束。這里苦银,我們像下面這樣定義這一列:
has_many?關(guān)聯(lián)
????????has_many?關(guān)聯(lián)建立兩個模型之間的一對多關(guān)系幔虏。在?belongs_to?關(guān)聯(lián)的另一端經(jīng)常會使用這個關(guān)聯(lián)。has_many?關(guān)聯(lián)表示模型的實例有零個或多個另一模型的實例想括。例如,對應(yīng)用中的作者和圖書模型來說烟逊,作者模型可以這樣聲明:
has_many :through?關(guān)聯(lián)
? ??????has_many :through?關(guān)聯(lián)經(jīng)常用于建立兩個模型之間的多對多關(guān)聯(lián)铺根。這種關(guān)聯(lián)表示一個模型的實例可以借由第三個模型,擁有零個和多個另一模型的實例访雪。例如,在醫(yī)療鍛煉中冬阳,病人要和醫(yī)生約定練習(xí)時間。這中間的關(guān)聯(lián)聲明如下:
has_one :through?關(guān)聯(lián)
????????has_one :through?關(guān)聯(lián)建立兩個模型之間的一對一關(guān)系。這種關(guān)聯(lián)表示一個模型通過第三個模型擁有另一模型的實例氯窍。例如,每個供應(yīng)商只有一個賬戶贝淤,而且每個賬戶都有一個賬戶歷史政供,那么可以這么定義模型:
has_and_belongs_to_many?關(guān)聯(lián)
????????has_and_belongs_to_many?關(guān)聯(lián)直接建立兩個模型之間的多對多關(guān)系布隔,不借由第三個模型。例如衅檀,應(yīng)用中有裝配體和零件兩個模型,每個裝配體有多個零件哀军,每個零件又可用于多個裝配體,這時可以按照下面的方式定義模型:
自聯(lián)結(jié)
????????設(shè)計數(shù)據(jù)模型時,模型有時要和自己建立關(guān)系淘衙。例如,在一個數(shù)據(jù)庫表中保存所有雇員的信息毯侦,但要建立經(jīng)理和下屬之間的關(guān)系具垫。這種情況可以使用自聯(lián)結(jié)關(guān)聯(lián)解決:
????????在遷移(模式)中,要添加一個引用字段筝蚕,指向模型自身: