在Meteor中建立两个集合之间关系的最简单方法?

时间:2014-12-19 14:24:33

标签: meteor

我是Meteor的新手,正在构建我的第一款应用。它是一款鸡尾酒配方应用程序,提供各种饮料和一系列食材。

每种饮料都含有许多成分。对于饮料中的每种成分,将有一个数量(数量)和一个度量单位(字符串)。

我隐约怀疑,对于这个用例,像publish-with-relations包这样的东西可能有点过分,但我不清楚创建和填充容纳这种关系的第三个集合的最佳方法饮料和配料之间。

这是我的饮料系列的样子:



Drinks = new Mongo.Collection('drinks');

Drinks.allow({
  update: function(userId, drink) { return ownsDocument(userId, drink); },
  remove: function(userId, drink) { return ownsDocument(userId, drink); }
});

Drinks.deny({
  update: function(userId, drink, fieldNames) {
    //only allow editing these fields:
    return (_.without(fieldNames, 'drinkName', 'drinkIngredients').length > 0);
  }
});

Meteor.methods({
  drinkInsert: function(drinkAttributes) {
    check(Meteor.userId(), String);
    check(drinkAttributes, {
      drinkName: String,
      drinkIngredients: Array,
      drinkDescription: String,
      drinkInstructions: String
    });

    var errors = validateDrink(drinkAttributes);

    if (errors.drinkName || errors.drinkIngredients)
      throw new Meteor.Error('invalid-drink', "You must enter a drink name and ingredients.");

    var drinkWithSameName = Drinks.findOne({drinkName: drinkAttributes.drinkName});
    if (drinkWithSameName) {
      return {
        drinkExists: true,
        _id: drinkWithSameName._id
      }
    }

    var user = Meteor.user();

    var drink = _.extend(drinkAttributes, {
      userId: user._id,
      author: user.username,
      submitted: new Date(),
      commentsCount: 0,
      upvoters: [],
      votes: 0
    });

    var drinkId = Drinks.insert(drink);

    return {
      _id: drinkId
    };
  },

  upvote: function(drinkId) {
    check(this.userId, String);
    check(drinkId, String);

    var affected = Drinks.update({
      _id: drinkId,
      upvoters: {$ne: this.userId}
    }, {
      $addToSet: {upvoters: this.userId},
      $inc: {votes: 1}
    });
    if (! affected)
      throw new Meteor.Error('invalid', "Vote not counted.");
  }
});

validateDrink = function (drink) {
  var errors = {};

  if (!drink.drinkName)
    errors.drinkName = "Please name your drink.";

  if (!drink.drinkIngredients)
    errors.drinkIngredients = "Please add some ingredients.";

  if (!drink.drinkDescription)
    errors.drinkDescription = "Please write a brief description of your drink.";

  if (!drink.drinkInstructions)
    errors.drinkInstructions = "Please include step-by-step instructions for mixing this drink.";

  return errors;
}




这是我的食材集合:



Ingredients = new Mongo.Collection('ingredients');

Meteor.methods({
  ingredientInsert: function(ingredientAttributes) {
    check(this.userId, String);
    check(ingredientAttributes, {
      ingredientName: String
    });

    var user = Meteor.user();

    ingredient = _.extend(ingredientAttributes, {
      userId: user._id,
      author: user.username,
      submitted: new Date()
    });

    //create the ingredient, save the id
    ingredient._id = Ingredients.insert(ingredient);

    return ingredient._id;
  }
});




我的想法是这种关系应该存在一个名为drinkIngredients的集合中,但我不清楚在Meteor中设置该集合的最佳方式。我很欣赏这方面的一些指导。或者,如果我不仅仅通过使用发布关系让自己变得更加困难,请告诉我。

非常感谢。

1 个答案:

答案 0 :(得分:2)

不幸的是,添加更多的集合不会有帮助,除非你做了一些真正多余的事情,比如将两个集合都归一化为一组文档。我的建议是选择here描述的其中一条路径。

请注意,在您的情况下,您实际上无法使用PWR,因为它没有通过数组进行反应性连接。我建议使用"加入客户端"技术。这与我们目前在Edthena上遵循的模式相同 - 尽可能使用PWR加入服务器,但在存在数组关系时加入客户端(使用路由器)。

有关详细信息,请参阅以下相关问题: