Ign*_*ago 4 mongoose node.js keystonejs
我正在尝试为集合编写 KeystoneJS (Mongoose) 模型Contest。这些是我的实际模型的简化版本:
比赛
Contest.add({
title: {
type: Types.Text,
initial: true,
required: true,
index: true
},
state: {
type: Types.Select,
options: ['draft', 'started', 'finished', 'resolved'],
default: 'draft'
},
awards: {
idContest: { /* <--- copy of _id */
type: Types.Text,
hidden: true
},
jury: {
winner: {
type: Types.Relationship,
ref: 'Entry',
many: false,
filters: {
'contest.id': ':idContest', /* <--- filter */
'contest.state': 'admited'
}
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
入口
Entry.add({
title: {
type: Types.Text,
initial: true,
required: true,
index: true
},
author: {
type: Types.Relationship,
ref: 'User',
initial: true,
index: true
},
contest: {
id: {
type: Types.Relationship,
ref: 'Contest',
index: true
},
state: {
type: Types.Select,
options: ['none', 'review', 'admited', 'rejected'],
default: 'none',
}
}
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在尝试过滤winner关系以仅显示参加本次比赛的条目。但我无法在比赛中做到这一点id,所以_id我只是创建了一个新的虚拟字段awards.idContest,其中填充了:
Contest.schema.pre('save', function(next) {
this.awards.idContest = (this.id || this._id);
next();
});
Run Code Online (Sandbox Code Playgroud)
我怎样才能完成相同的任务但没有额外的字段?就像是:
jury: {
winner: {
type: Types.Relationship,
ref: 'Entry',
many: false,
filters: {
'contest.id': ':id',
'contest.state': 'admited'
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ignacio,正如我在之前的评论中提到的,截至撰写本文时,Keystone 尚未提供通过当前模型的 id 过滤关系的能力。然而,受到您问题的启发,我决定提交一个拉取请求(PR #609),将此功能添加到 Keystone。
新功能将完全按照您的预期工作。在您的用例中,代码将是:
jury: {
winner: {
type: Types.Relationship,
ref: 'Entry',
many: false,
filters: {
'contest.id': ':_id', /* <--- filter */
'contest.state': 'admited'
}
}
}
Run Code Online (Sandbox Code Playgroud)
PR 合并后我会在这里发表另一条评论。#609还包括一般关系过滤器功能的文档,因此,一旦合并,该文档将在下一个版本后包含在 Keystone 网站中。
| 归档时间: |
|
| 查看次数: |
2156 次 |
| 最近记录: |