gpt4 book ai didi

javascript - 将多条记录添加到模型的集合 Sailsjs

转载 作者:行者123 更新时间:2023-11-28 00:59:49 27 4
gpt4 key购买 nike

我的 Sailsjs 应用程序中有以下具有多对多关系的模型:

事件.js:

attributes: {
title : { type: 'string', required: true },
description : { type: 'string', required: true },
location : { type: 'string', required: true },
maxMembers : { type: 'integer', required: true },
currentMembers : { collection: 'user', via: 'eventsAttending', dominant: true },
creator : { model: 'user', required: true },
invitations : { collection: 'invitation', via: 'eventID' },
tags : { collection: 'tag', via: 'taggedEvents', dominant: true },
lat : { type: 'float' },
lon : { type: 'float' },
},

标签.js:

attributes: {
tagName : { type: 'string', unique: true, required: true },
taggedEvents : { collection: 'event', via: 'tags' },
},

根据文档,这种关系看起来是正确的。我在 tag.js 中有以下方法,它接受标签字符串数组和事件 id,并且应该添加或删除传入的标签:

modifyTags: function (tags, eventId) {
var tagRecords = [];

_.forEach(tags, function(tag) {
Tag.findOrCreate({tagName: tag}, {tagName: tag}, function (error, result) {
tagRecords.push({id: result.id})
})
})

Event.findOneById(eventId).populate('tags').exec(function(error, event){
console.log(event)
var currentTags = event.tags;
console.log(currentTags)
delete currentTags.add;
delete currentTags.remove;

if (currentTags.length > 0) {
currentTags = _.pluck(currentTags, 'id');
}

var modifiedTags = _.pluck(tagRecords, 'id');
var tagsToAdd = _.difference(modifiedTags, currentTags);
var tagsToRemove = _.difference(currentTags, modifiedTags);
console.log('current', currentTags)
console.log('remove', tagsToRemove)
console.log('add', tagsToAdd)

if (tagsToAdd.length > 0) {
_.forEach(tagsToAdd, function (tag) {
event.tags.add(tag);
})
event.save(console.log)
}

if (tagsToRemove.length > 0) {
_.forEach(tagsToRemove, function (tagId) {
event.tags.remove(tagId)
})
event.save()
}
})
}

这是从事件模型调用该方法的方式:

afterCreate: function(record, next) {
Tag.modifyTags(tags, record.id)
next();
}

当我发布到 event/create 时,我得到以下结果:http://pastebin.com/PMiqBbfR .

看起来好像是方法调用本身被循环,而不仅仅是tagsToAdd 或tagsToRemove 数组。更令人困惑的是,在最后,在事件的最后一个日志中,看起来该事件具有正确的标签。然而,当我发布到 event/1 时,标签数组为空。我还尝试在每个 .add() 之后立即保存,但仍然得到类似的结果。

理想情况下,我想循环遍历tagsToAdd和tagsToRemove数组,修改它们在模型集合中的id,然后在模型上调用一次.save()

我花了很多时间尝试调试这个,所以任何帮助将不胜感激!

最佳答案

您的实现存在一些问题,但主要问题是您正在处理某些方法 - 即 .save().findOrCreate 作为同步方法,当它们(像所有 Waterline 方法一样)异步时,需要回调。因此,您实际上是在并行运行一堆代码,而不是等待它完成后再返回。

此外,由于您想要做的似乎是用这个新列表替换当前的事件标签,因此您想出的方法有点过度设计 - 您不这样做不需要使用 event.tags.addevent.tags.remove。您可以只使用普通的旧更新

因此您可以将 modifyTags 方法重写为:

modifyTags: function (tags, eventId, mainCb) {

// Asynchronously transform the `tags` array into an array of Tag records
async.map(tags, function(tag, cb) {
// For each tag, find or create a new record.
// Since the async.map `cb` argument expects a function with
// the standard (error, result) node signature, this will add
// the new (or existing) Tag instance to the resulting array.
// If an error occurs, async.map will exit early and call the
// "done()" function below
Tag.findOrCreate({tagName: tag}, {tagName: tag}, cb);
}, function done (err, tagRecords) {
if (err) {return mainCb(err);}
// Update the event with the new tags
Event.update({id: eventId}, {tags: tagRecords}).exec(mainCb);
});

}

查看async.map的完整文档here .

如果您想坚持使用 .add.remove 实现,您仍然需要使用 async.map,并且在 done 方法中完成其余的逻辑。您不需要两次 .save 调用;只需先运行所有 .add.remove 代码,然后执行单个 .save(mainCb) 即可完成。

而且我不知道您想通过从 currentTags 中删除 .add.remove 方法来实现什么目的(其中是对 event.tags 的直接引用),但它不起作用,并且只会在以后引起困惑!

关于javascript - 将多条记录添加到模型的集合 Sailsjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25753026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com