我正在尝试为Contest
集合编写KeystoneJS(Mongoose)模型。这些是我实际模型的简化版本:
比赛
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'
}
}
}
}
});
条目
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',
}
}
});
正如您所看到的,我正在尝试过滤winner
关系,以仅显示参与此竞赛的参赛作品。但我无法通过比赛id
或_id
来完成,所以我刚创建了一个新的虚拟字段awards.idContest
,其中包含:
Contest.schema.pre('save', function(next) {
this.awards.idContest = (this.id || this._id);
next();
});
我怎么能完成同样但没有额外的领域?类似的东西:
jury: {
winner: {
type: Types.Relationship,
ref: 'Entry',
many: false,
filters: {
'contest.id': ':id',
'contest.state': 'admited'
}
}
}
答案 0 :(得分:4)
Ignacio,正如我在前面的评论中提到的那样,在撰写本文时,Keystone没有提供按当前模型的id过滤关系的能力。但是,受到您的问题的启发,我决定向Keystone提交一个拉取请求(PR #609)。
新功能将完全按预期工作。在您的用例中,代码为:
jury: {
winner: {
type: Types.Relationship,
ref: 'Entry',
many: false,
filters: {
'contest.id': ':_id', /* <--- filter */
'contest.state': 'admited'
}
}
}
一旦公关合并,我会在这里发表另一条评论。 #609还包括关系过滤器功能的文档,因此,一旦合并,文档将在下一次构建后包含在Keystone网站中。