3

我正在使用sails@0.10.0-rc4 中的自定义适配器来支持关联,但我无法让它们与我的适配器一起工作。我的配置是文章和统计数据之间的一对多关联。我的模型和适配器设置如下:

// 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>]}}。它向我返回一个文章列表,但应该从另一个模型(统计)填充的字段只是一个空列表。

我觉得这与我的适配器没有获得正确的 where 参数来搜索主键上的相关模型有关。为了进一步测试这一点,我使用sails-mongo 适配器设置了一个测试一对多关系。在这种情况下,适配器确实收到了我期望的参数,并且关联工作正常。

有谁知道为什么.populate('stats')不向我的适配器发送正确的“where”参数?

更新 3/7

因此,似乎关联中发生的事情是 SomeModel.find() 将命中适配器一次,然后 .populate('othermodel') 使用第一个请求的主键再次命中适配器。然后将两者的结果结合在一起。就我而言,由于某种未知原因,对适配器的第二次打击没有发生。

更新

最初的问题与下面评论中提到的属性命名错误有关。但是, particlebanana提到的最终填充步骤似乎仍然存在一些问题:

最后一步将:从所有返回的查询操作中获取所有查询结果,并将它们组合到内存中以构建一个可以在 exec 回调中返回的结果集。

我看到所有必需的查询现在都在触发,但它们实际上并没有填充别名。这是调用,以 gist 的形式添加了一些调试输出,以便于使用:https ://gist.github.com/jasonsims/9423170

4

2 回答 2

3

看起来你在正确的轨道上!操作集的建立方式,.find()文章上的 应该使用第一个日志(空位置)运行,第二个查询应该使用日志中的 parentId 条件运行。parentId第二个查询没有运行,因为当您没有从第一个查询返回任何内容时,它无法构建该主键数组。

简短的回答:您需要在回调中返回一些find内容才能查看第二个日志,该日志应该符合您的预期标准。

查询生命周期如下所示:

  • 检查所有查询片段是否都在同一个连接上,如果没有,则找出哪些查询将在哪些连接上运行
  • 对于单个连接上的所有查询,检查适配器是否支持本机连接(有一个.join()方法,如果是,您可以向下传递条件并让适配器处理连接。
  • 如果未定义本地连接方法,则运行“父”操作(在本例中为Article.find()
  • 使用父操作的结果为需要运行的任何种群建立标准。(您的条件中的 parentId 数组)并运行子结果。
  • 从所有返回的查询操作中获取所有查询结果,并在内存中组合它们以构建一个可以在exec回调中返回的结果集。

我希望这会有所帮助。把你的 repo 的 url 给我,如果它能够开源,我会查看它,如果你遇到任何问题,可以提供更多帮助。

于 2014-03-07T19:48:01.743 回答
0

总结一下,这里有多个问题导致关联不填充:

  1. 自定义主键
    使用自定义主键连接模型中的数据时,水线出现问题。@particlebanana修复了这个问题8eff54b,它应该包含在水线的下一个 rc 中(waterline@0.10.0-rc5)。
  2. 格式错误的 SOQL 查询
    当 waterline 第二次查询适配器以获取子行时,它使用{ foreignKey: [ value ] }. 由于该值是一个列表,因此 jsforce 错误地生成了 SOQL 查询,因为它希望所有列表值都伴随有$inor$nin运算符。我在github/jsforce#9中解决了这个问题,它现在包含在 jsforce@1.1.2 中。
  3. 模型属性区分大小写
    我的项目中的模型是在snakeCase 中定义的,但来自Salesforce 的json 响应使用的是EveryWordCapitalized。这会导致水线中的一对多连接在运行时将许多子记录减少到一个_.uniq(childRows, pk)。由于模型已定义pk == id,但从 Salesforce 返回的实际值为pk == Id,因此对 uniq 的调用会清除除一个之外的所有子记录。我不完全确定这是否应该是水线错误,但修复模型属性定义中的大写解决了这个问题。
于 2014-03-17T18:02:15.243 回答