gpt4 book ai didi

javascript - 避免多态 hasAndBelongsToMany 通过模型关系中的重复

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:40 25 4
gpt4 key购买 nike

我与多态直通模型有相当复杂的关系。在应用程序中,有一个标签系统,可以在其中标记用户和另一个模型。为了避免重复的字符串条目,我使用了直通模型 (TagLink),其中包含标记 ID、标记模型名称和标记实例 ID。

所以我有

User --+
|
+---> TagLink -----------> Tag
| - tagId - id
Item --+ - taggableId - text
- taggableName
(User or Item)

链接关系是hasAndBelongsToMany。问题是,当我将新标签发布到 /items/:id/tags/users/:id/tags 时,它会被保存,但我可以创建为许多我想要的相同文本,没有任何错误。

我想要的是,在发布到 /items/:id/tags/users/:id/tags 后,它:

  • 创建一个新的标签条目(如果尚不存在),然后添加一个新的 TagLink 条目(这是当前行为,但即使相同的标签已存在)
  • 仅在标签已存在时创建 TagLink 条目

我想到了两种解决方案:

  • 以某种方式重写 Tag 的创建方法来检查是否存在,然后手动创建一个 TagLink 条目(如果存在)。如果没有,请按默认操作。
  • 使用~所有 CRUD URI 公开标签列表 (/tags),然后强制在 /{items,users}/:id/tags 上使用标签 ID .

理想情况下,我更喜欢第一个,因为它更透明并且 API 更流畅。

因此,欢迎任何线索!

最佳答案

我最终做了第一个解决方案,这非常简单。这个想法是替换引导脚本中的 User.create 方法,该方法查找具有相同文本的标签,如果找到则返回它。

module.exports = function(app) {
var Tag = app.models.Tag;

// Override Tag.create to avoid duplicates
Tag.createRaw = Tag.create;
Tag.create = function(data, token, cb) {
// Find matching tag
Tag.findOne({where: {text: data.text}}, (err, tag) => {
if (err) cb(err);
// If the tag is found, return it
else if (tag) cb(null, tag);
// Else create it
else Tag.createRaw(data, token, cb);
});
}
}

关于javascript - 避免多态 hasAndBelongsToMany 通过模型关系中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43997951/

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