2017-05-16 12 views
1

多型スルーモデルとはかなり複雑な関係にあります。このアプリには、ユーザーと別のモデルにタグを付けるタグシステムがあります。重複する文字列の入力を避けるため、タグID、タグ付きモデル名、タグ付きインスタンスIDを含むスルーモデル(TagLink)を使用しました。ポリモーフィックなhasAndBelongsToManyモデルとの重複を回避する

だから私は、リンク関係がhasAndBelongsToManyある

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

を持っています。問題は、/items/:id/tagsまたは/users/:id/tagsに新しいタグを投稿すると保存されますが、同じテキストで何もエラーを発生させずに何度でも作成できます。

私が希望することは、/items/:id/tagsまたは/users/:id/tagsに投稿するときに、それされています。それはすでに存在していない場合

  • は新しいタグエントリを作成し、これは現在の動作です(新しいTagLinkエントリを追加し、しかし、同じタグが既に存在する場合でも)タグは、すでに

私は約2ソリューションと思っ存在する場合

  • が単独TagLinkエントリを作成します。

    • 何らかの理由で、作成メソッドTagをオーバーライドして存在を確認し、手動でTagLinkエントリが存在する場合は作成します。そうでない場合は、デフォルトで実行します。
    • タグリスト(/tags)を〜すべてのCRUD URIで公開し、強制的にタグIDを/{items,users}/:id/tagsに使用します。

    理想的には、最初の方が透明でAPIがスムーズになります。

    だから、どんなリードも歓迎です!

  • 答えて

    1

    私は最初の解決策を完成させましたが、これはかなり簡単でした。この考え方は、同じtextのタグを見つけたブートスクリプト内の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); 
         }); 
        } 
    } 
    
    関連する問題