Ruby on rails Rails活动记录关系类别和子类别

Ruby on rails Rails活动记录关系类别和子类别,ruby-on-rails,Ruby On Rails,基本上,我的老师只创建了一个“类别”模型,但当我们运行种子文件时: Category.create([ { name: "community", url: "community" } ]); Category.create([ { name: "activities", url: "activities", parent_id: 1 }, { name: "artists", url: &quo

基本上,我的老师只创建了一个“类别”模型,但当我们运行种子文件时:

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上有一个引用

然后在分类模型上,我看到:

class Category < ApplicationRecord
    belongs_to :parent, class_name: "Category", optional: true
    has_many :subcategories, class_name: "Category", foreign_key: :parent_id, dependent: :destroy
end
这也让我有点困惑

有谁能用外行的术语解释上面一行一行的模型关联吗


很抱歉,我太糊涂了,我是一个新手。

这是一种自连接关系,它是纯SQL,Active Record有自己的方法使它工作

线路

belongs_to :parent, class_name: "Category", optional: true
正在建立categories表与自身之间的关系,其中需要
class_name
,因为按照惯例Rails将使用第一个参数来推断表名。第三个参数
optional
表示,使用
父id创建新记录不受约束。这一策略构成了一个类别和一个子类别;类别没有父id,而子类别必须有父id

外键也是从第一个参数
parent
推断出来的,因此关系基于列
parent\u id

第二行

has_many :subcategories, class_name: "Category", foreign_key: :parent_id, dependent: :destroy
也可以建立类别与类别之间的另一种关系,但您可以轻松访问具有该类别的子类别,反之亦然。
class\u name
保持不变,因为它是同一个表,但这一次不能推断出
foreign\u key
,因此您必须明确指出,第四个参数
dependent::destroy
使与类别相关联的每个子类别在其类别被销毁时都被销毁,不留下“孤立项”记录

如何只获取类别而不获取子类别

Category.where(parent_id: nil)

通过查询categories表并过滤那些没有家长id的行(如果有老师参与,我的朋友,你有一些工作要做。)一些提示:一对多,自连接。。。享受你的冒险!:)
Category.where(parent_id: nil)