5

有没有人有一个在 keystonejs 中为关系字段添加名称的好例子?现在它只保存一个 id,所以如果我需要在翡翠模板中显示该字段名称,我还需要查询该关系模型。理想情况下是这样的:

var keystone = require('keystone'),
Types = keystone.Field.Types;

/**
 * Titles Model
 * =============
 */

var Title = new keystone.List('Title');

Title.add({
  name: { type: String, required: true, initial: true },
  room: { type: Types.Relationship, initial: true, required: true, ref: 'Screening', addNew: false },
  businessUnit: { type: Types.Relationship, initial: true, required: true, ref: 'BusinessUnit', addNew: false }
});

Title.defaultSort = '-createdAt';
Title.defaultColumns = 'name, room';
Title.register();

会这样保存:

title = {
    name: 'name',
    room: 3141234123442,
    businessUnit: {
        name: 'business name',
        _id: 123412341234
    }
}

如果没有示例,如果有人可以引导我完成自定义关系字段类型以从关系选择菜单中存储值和 id 的最佳实践,我可能会弄清楚。该站点将在每个集合中包含 1000 多个文档,因此我现在需要关注性能和最佳实践。

4

1 回答 1

3

你还不能用 Keystone 让它像这样保存,但你可以让它像你想要的那样将对象传递给你的玉模板。

您只需要根据 mongoose / mongodb 功能“填充”关系字段。

**因此您的 businessUnit 模型可能如下所示:

var keystone = require('keystone');
var Types = keystone.Field.Types;

var BusinessUnit = new keystone.List('BusinessUnit', {
    autokey: { from: 'name', path: 'key', unique: true },
    plural: 'BusinessUnits'
});

BusinessUnit.add({
    name: { type: String, required: true },
});   
BusinessUnit.relationship({ ref: 'Title', path: 'title', refPath: 'businessUnit' }); 
BusinessUnit.register();

您的 Title 模型如上

var keystone = require('keystone'),
Types = keystone.Field.Types;

var Title = new keystone.List('Title');

Title.add({
  name: { type: String, required: true, initial: true },
  room: { type: Types.Relationship, initial: true, required: true, ref: 'Screening', addNew: false },
  businessUnit: { type: Types.Relationship, initial: true, required: true, ref: 'BusinessUnit', addNew: false }
});

Title.defaultSort = '-createdAt';
Title.defaultColumns = 'name, room';
Title.register();

控制器的重要部分可能如下所示

//Get all Titles with their nested businessUnits.
view.on('init', function(next) {
  keystone.list('Title').model.find()
  .populate('businessUnit')
  .exec(function(err, results) {
    if(err) {
      console.log(err);
      return next(err);
    } else {
      locals.data.titlesWithNestedBusinessUnits = results;
      next(err);
    }
  });
});

附带说明一下,根据.populate方法功能,这只能工作一层。如果你想深入一些(效率很低),你可以使用mongoose deep populatehttps://github.com/buunguyen/mongoose-deep-populate

于 2015-12-05T12:22:40.663 回答