![](/img/trans.png)
[英]Best way to handle Category / Subcategory relationship Ruby on 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.