我正在使用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