簡體   English   中英

Rails 活動記錄關系類別和子類別

[英]Rails active record relationship category and subcategory

基本上,我的老師只創建了一個 model,它是“類別”,但是當我們運行種子文件時:

Category.create([
{ name: "community", url: "community" }
]);

Category.create([
{ name: "activities", url: "activities", parent_id: 1 },
{ name: "artists", url: "artists", parent_id: 1 },
{ name: "childcare", url: "childcare", parent_id: 1 }
]);

如您所見,第二個 Category.create 上有一個引用。

然后在類別 model 上,我看到了這個:

class Category < ApplicationRecord
    belongs_to :parent, class_name: "Category", optional: true
    has_many :subcategories, class_name: "Category", foreign_key: :parent_id, dependent: :destroy
end

如您所見,我的老師沒有創建兩個不同的模型來處理讓我感到困惑的關系。

然后他在public_controller.rb文件中輸入:

def home
    @categories = Category.where(parent_id: nil)
end 

這也讓我有點困惑。

誰能通俗地解釋一下上面做的model關聯?

抱歉,我很困惑,而且是這里的新手。

這是一個自連接關系,它是純粹的 SQL,Active Record 有自己的方式讓它工作。

belongs_to :parent, class_name: "Category", optional: true

在類別表與自身之間建立關系,其中需要class_name ,因為按照慣例 Rails 將使用第一個參數來推斷表名。 第三個參數optional說明使用parent_id創建新記錄沒有限制。 該策略構成了類別和子類別; 類別沒有parent_id ,而子類別必須有一個。

外鍵也是從第一個參數parent推斷出來的,因此關系基於parent_id列。

第二行

has_many :subcategories, class_name: "Category", foreign_key: :parent_id, dependent: :destroy

也建立了從類別到類別的另一種關系,但您可以輕松訪問具有該類別的子類別,反之亦然。 class_name保持不變,因為它是同一張表,但是這次不能推斷出foreign_key ,所以你必須明確,第四個參數dependent: :destroy是什么使與類別相關聯的每個子類別在其類別時被銷毀被銷毀,沒有留下任何“孤兒”記錄。

你如何只獲得類別而不是子類別?

Category.where(parent_id: nil)

通過查詢類別表並過濾那些沒有parent_id的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM