按ID过滤KeystoneJS关系

时间:2014-09-03 09:56:20

标签: node.js mongoose keystonejs

我正在尝试为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'
          }
        }
      }

1 个答案:

答案 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网站中。