3

関連をサポートするsails@0.10.0-rc4のカスタムアダプターに取り組んでいますが、アダプターと連携して機能させるのに問題があります。私の構成は、記事と統計の間の 1 対多の関連付けです。私のモデルとアダプターは次のように設定されています。

// api/models/article.js
module.exports = {
  connection: ['myadapter'],
  tableName: 'Knowledge_Base__kav',
  attributes: {
    KnowledgeArticleId: { type: 'string', primaryKey: true }
    stats: {
      collection: 'stats',
      via: 'parentId'
    } 
  }

// api/models/stats.js
module.exports = {
  connection: ['myadapter'],
  tableName: 'KnowledgeArticleViewStat',
  attributes: {
    count: 'integer',
    ParentId: {
      model: 'article'
    }
  }
}


// adapter.js  
find: function(connectionName, collectionName, options, cb) {  
  console.dir(options)
  // output
  // {where: null} 
  db.query(options, function(err, res)) {
    cb(err, res)
  }
}

ただし、を使用してデータを入力しようとすると、アダプターが受け取ると予想されるときにArticle.find().populate('stats').exec(console.log())、アダプターがオプションとして取得されます。記事のリストが返されますが、別のモデル (統計) から入力されるはずのフィールドは空のリストです。{where: null}{where: {parentId: [<some-article-id>]}}

これは、アダプターが主キーで関連モデルを検索するための適切な場所パラメーターを取得していないという事実に関連しているように感じます。これをさらにテストするために、sails-mongo アダプターを使用してテスト用の 1 対多の関係をセットアップします。この場合、アダプターは期待どおりのパラメーターを受け取り、関連付けは正常に機能しました。

.populate('stats')適切な「場所」パラメーターをアダプターに送信しない理由について、誰かが何か考えを持っていますか?

3/7 更新

そのため、アソシエーションで何が起こるかは、 SomeModel.find() がアダプターに1回ヒットし、次に .populate('othermodel') が最初のリクエストの主キーを使用してアダプターに再度ヒットするようです。次に、両方の結果が結合されます。私の場合、アダプターに対する 2 回目のヒットは、何らかの理由で発生していません。

アップデート

元の問題は、以下のコメントに記載されている属性の命名エラーに関連していました。ただし、粒子バナナで言及されている最終的な人口ステップにはまだいくつかの問題があるようです。

最終ステップは次のとおりです。返されたすべてのクエリ操作からすべてのクエリ結果を取得し、それらをメモリ内で結合して、exec コールバックで返すことができる結果セットを構築します。

必要なすべてのクエリが実行されていることがわかりますが、エイリアスを実際に設定できていません。簡単に使用できるように、gist の形式でデバッグ出力を追加した呼び出しを次に示します: https://gist.github.com/jasonsims/9423170

4

2 に答える 2

3

あなたは正しい軌道に乗っているようです!操作セットが構築される方法.find()として、Article は最初のログ (空の場所) で実行され、2 番目のクエリはログの parentId 条件で実行される必要があります。parentId最初のクエリから何も返さない場合、主キーの配列を作成できないため、2 番目のクエリは実行されていません。

簡単な答え: 2 番目のログを表示するには、コールバックで何かを返す必要がありfindます。これは、予想される基準と一致する必要があります。

クエリのライフサイクルは次のようになります。

  • すべてのクエリの断片が同じ接続上にあるかどうかを確認し、そうでない場合は、どのクエリがどの接続で実行されるかを調べます
  • 単一の接続に対するすべてのクエリについて、アダプターがネイティブ結合をサポートしているかどうかを確認します (.join()メソッドがある場合は、基準を渡してアダプターに結合を処理させることができます)。
  • ネイティブ結合メソッドが定義されていない場合は、「親」操作 (この場合はArticle.find())を実行します。
  • 親操作の結果を使用して、実行する必要がある母集団の基準を構築します。(基準のparentId配列) を実行し、子の結果を実行します。
  • 返されたすべてのクエリ操作からすべてのクエリ結果を取得し、それらをメモリ内で組み合わせて、execコールバックで返すことができる結果セットを構築します。

それがいくつかの助けになることを願っています。あなたのリポジトリの URL を教えてください。オープン ソース化できるかどうかを調べます。問題が発生した場合は、さらに役立つことがあります。

于 2014-03-07T19:48:01.743 に答える