Rust 在Diesel中引用同一表的多个外键

Rust 在Diesel中引用同一表的多个外键,rust,rust-diesel,Rust,Rust Diesel,我试图创建一个引用同一个表两次的结构。其目的是创建一种类别层次结构。以下是我为下表所做的工作: 创建表产品\u类别\u汇总( id串行主键, 上限\u类别\u id整数不为空, 下\u类别\u id整数不为空, 外键(上级类别id)引用产品类别(id), 外键(下\u类别\u id)引用产品\u类别(id) ); 创建表产品类别( id串行主键, 名称varchar unique不为null ); 我正在尝试创建匹配的结构,如中所示: #[派生(可识别、可查询)] #[表\u name=“产品

我试图创建一个引用同一个表两次的结构。其目的是创建一种类别层次结构。以下是我为下表所做的工作:

创建表产品\u类别\u汇总(
id串行主键,
上限\u类别\u id整数不为空,
下\u类别\u id整数不为空,
外键(上级类别id)引用产品类别(id),
外键(下\u类别\u id)引用产品\u类别(id)
);
创建表产品类别(
id串行主键,
名称varchar unique不为null
);
我正在尝试创建匹配的结构,如中所示:

#[派生(可识别、可查询)]
#[表\u name=“产品\u类别”]
发布结构ProductCategory{
id:i32,
名称:String,
}
#[派生(可查询、可识别、关联)]
#[属于(ProductCategory,foreign=“upper\u category\u id”)]
#[属于(ProductCategory,foreign=“lower\u category\u id”)]
#[表\u name=“产品\u类别\u汇总”]
发布结构ProductCategoryRollup{
id:i32,
上层类别id:i32,
较低类别id:i32,
}
我得到一个错误,说:

error[E0119]:类型`entities::ProductCategoryRollup`的trait`diesel::associations::BelongsTo`的实现冲突:
-->src/entities.rs:29:35
|
29 |#[派生(可查询、可识别、关联)]
|                                   ^^^^^^^^^^^^
|                                   |
|这里的第一个实现
|“entities::ProductCategoryRollup”的实现冲突`
|
=注意:此错误源于派生宏(在夜间构建中,使用-Z宏反向跟踪运行以获取更多信息)
让多个外键引用同一个表的正确方法是什么?这是柴油机的固有局限性,但尚未解决吗?

特性定义为:

pub trait BelongsTo{
输入ForeignKey:Hash+Eq;
输入ForeignKeyColumn:Column;
fn外键(&self)->选项;
fn foreign_key_column()->Self::ForeignKeyColumn;
}
由于
ForeignKey
(和
ForeignKeyColumn
)是关联类型,而不是泛型参数,因此给定的
只能有一个
BelongsTo
的实现



一般来说,
属于
似乎是相当有限的;请注意,它也仅限于一列。

因此,我一直在研究柴油机,正如上面的回答中所指出的,这个问题是由于
属性的定义方式而产生的

避免这种情况的一种方法是采取如下措施:

//此特性包含所有类型的通用行为
//代表产品类别
特征产品类别{
fn new(id:i32,name:String)->Self;
}
#[衍生(可识别)]
#[表\u name=“产品\u类别”]
发布结构RawProductCategory{
id:i32,
名称:String,
}
#[衍生(可识别)]
#[表\u name=“产品\u类别”]
发布结构UpperProductCategory{
酒吧id:i32,
酒吧名称:String,
}
#[衍生(可识别)]
#[表\u name=“产品\u类别”]
发布结构LowerProductCategory{
酒吧id:i32,
发布名称:String
}
针对RawProductCategory的impl ProductCategory{
fn新(id:i32,名称:String)->Self{
原始产品类别{
身份证件
名称
}
}
}
impl ProductCategory用于UpperProductCategory{
fn新(id:i32,名称:String)->Self{
上层产品类别{
身份证件
名称
}
}
}
impl ProductCategory用于LowerProductCategory{
fn新(id:i32,名称:String)->Self{
低产品类别{
身份证件
名称
}
}
}
RawProductCategory的impl可查询{
类型Row=(i32,字符串);
fn构建(行:Self::row)->Self{
ProductCategory::新建(第0行,第1行)
}
}
UpperProductCategory的impl可查询{
类型Row=(i32,字符串);
fn构建(行:Self::row)->Self{
ProductCategory::新建(第0行,第1行)
}
}
可对LowerProductCategory执行简单查询{
类型Row=(i32,字符串);
fn构建(行:Self::row)->Self{
ProductCategory::新建(第0行,第1行)
}
}
现在我已经注意到,对于Queryable的实现,我有相当大的代码重复,但我不想通过引入另一个结构来减少它,该结构包含一个实现
ProductCategory
特征的字段


现在有趣的部分来了。我已经注意到为什么会出现这种情况,并提出了一个新的建议。如果这个问题得到解决,我将相应地更新这个答案,以展示实现同样目标的更好方式。

这对我来说当然很清楚,但这并不能回答我如何实现我想要实现的目标。啊,对不起;我陷入了探索,忘记了你问题的那一部分。老实说,我不确定这是否可能。柴油机开发人员在r/rust(Reddit)上闲逛,因此我建议您在那里提问。如果您这样做,请交叉引用堆栈溢出问题,这样,如果任何人有解决方法,他们也可以在此处回答。我已在Github中提交了一个问题,并链接到此处,因此我们将不得不拭目以待。@TheCoolDrop:祝您好运,并(可能早日)新年快乐。