【问题标题】:Filter KeystoneJS relationship by id按 id 过滤 KeystoneJS 关系
【发布时间】:2014-10-27 18:43:30
【问题描述】:

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

【问题讨论】:

  • 您能否提供您在jury 字段中引用的Entry 列表的定义?没有它,就很难给你一个决定性的答案。
  • @JohnnyEstilles 我添加了Entry 模型。谢谢。
  • Ignacio,这是一个非常有趣的用例。 Keystone 的关系filters 选项目前不具备执行此类过滤器的能力。今天晚些时候,我将提交 PR 以添加和记录您正在寻找的功能。 PR 合并后我会在这里发布答案。

标签: node.js mongoose keystonejs


【解决方案1】:

Ignacio,正如我在前面的评论中提到的,在撰写本文时,Keystone 没有提供通过当前模型的 id 过滤关系的能力。但是,受您的问题启发,我决定提交一个拉取请求 (PR #609),将此功能添加到 Keystone。

新功能将完全按照您的预期工作。在您的用例中,代码将是:

  jury: {
    winner: {
      type: Types.Relationship,
      ref: 'Entry',
      many: false,
      filters: {
        'contest.id': ':_id',   /* <--- filter */
        'contest.state': 'admited'
      }
    }
  }

PR 合并后,我将在此处发表另一条评论。 #609 通常还包括关系过滤器功能的文档,因此,一旦合并,该文档将在下一次构建后包含在 Keystone 网站中。

【讨论】:

  • PR #609 今天被合并了。该功能将在 KeystoneJS 的下一个版本中提供。
猜你喜欢
  • 2019-06-19
  • 2016-12-10
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2021-12-15
  • 2012-01-23
  • 2014-01-15
  • 2018-05-15
相关资源
最近更新 更多