首先,我在 NoSQL 和 node.js 中执行此操作。我认为这不应该影响这个问题,但它会帮助理解我的例子。
我有一个页面模型和一个看起来像这样的标签:
var Page = app.ormDb.define('pages', {
uuid : { type: String, index: true, length: 40, default: function () { return uuid.v4(); } },
title : { type: String, index: true, length: 255 },
url : { type: String, index: true, length: 255 },
summary_mu : { type: String, length: 1024 },
summary_html : { type: String },
summary_hist : { type: JSON, default: function() { rerutn { items : [] }; } },
sections : { type: JSON, default: function() { rerutn { items : [] }; } },
tags : { type: JSON, default: function() { rerutn { items : [] }; } },
date : { type: Date, default: function() { return new Date(); } },
updated : { type: Date, default: function() { return new Date(); } }
});
var Tag = app.ormDb.define('tags', {
uuid : { type: String, index: true, length: 40, default: function () { return uuid.v4(); } },
name : { type: String, index: true, length: 255 },
url : { type: String, index: true, length: 255 },
desc : { type: String, length: 1024 },
date : { type: Date, default: function() { return new Date(); } },
updated : { type: Date, default: function() { return new Date(); } }
});
所以现在我有一些数据维护问题,例如当我向页面添加标签时,我需要确保有标签条目。为此,我在模型上创建了一个方法。
// Add a tag to a page
// tag .. The tag to add
Page.prototype.addTag(tag, done) {
var _this = this;
if (_this.tags == null) {
_this.tags = { items:[] };
}
var index = _this.tags.items.indexOf(tag);
if (index == -1) {
_this.tags.items.push(tag);
}
async.waterfall([
function (cb) {
app.models.tag.count({'name': tag}, cb);
},
function (count, cb) {
if (count == 0) {
app.models.tag.create({
name : tag,
}, function (err, newTag) {
return cb(err, tag);
});
} else {
return cb(null, tag);
}
}
], function (err, items) {
done(err, items);
});
}
在控制器中,我有验证用户输入的代码,加载当前页面,调用上面的 Page 方法添加标签,最后保存更新的页面。请注意,在上面的方法中,我正在检查标签集合是否存在标签,并在需要时创建它。
这是正确的,还是应该将 Page 方法的逻辑移动到控制器并且模型只处理一个模型而不处理其他模型?
我的理由是,如果不检查/创建标签集合中的标签,我永远不会向页面添加标签。