我已经使用KnexJS一段时间了,并希望转换到BookshelfJS,因为我在服务器端的模型类开始变得有点毛茸茸,以及为什么重新发明轮子。
对于我的很多API服务器,我想做的是预先获取相关模型的列表(文档有很多并且属于许多编辑器),而不必预先获取整个事物。理想情况下,我最终会
document = {
id: 1
body: 'foobar'
editor_ids: [1, 2]
}
现在,我可以通过在文档定义上执行编辑器:belongsToMany(Profiles),然后执行fetch()。withRelated([' editors'])来实现这一点,但问题在于它返回fetch上的完整Profile对象。
这会生成一个不需要的无关连接(documents_editors join editors on editors.id = documents_editors.editor_id
),并符合我的客户端应用所期望的规范,(嵌入的ID,然后仅在JSON响应中添加的配置文件本身)可选地,实际上在实践中从不,因为配置文件倾向于缓存并加载到其他地方),我必须通过解析Document.relations手动推送editor_ids属性,这也会增加(一点点)额外的时间。 / p>
所以,最终,我可以做我想做的事,但它并不优雅。理想情况下,BookshelfJS中有一些我可以做的事情,比如
Document = bookshelf.Model.extend
tableName: 'documents'
fancyValue: ->
@rawQuery 'select editor_id from documents_editors where document_id = ?', [@id]
或者在那里构建一个knex风格的查询。我知道在上面的特定用例中,原始查询有点矫枉过正,但实际上我确实有一些讨厌的查询要运行。我跟踪用户社区成员资格以及向社区授予文档的权限,这意味着我使用postgres风格的CTE来执行类似
的操作 with usergroups as
(
select communities.id from communities inner join edges
on communities.id = edges.parent_id and edges.parent_type = 'communities'
and edges.child_id = ? and edges.child_type = 'profiles'
and edges.type = 'grant: comment'
)
select distinct documents.id as parent_id, 'documents' as parent_type
from documents inner join edges
on edges.parent_id = documents.id and edges.parent_type = 'documents'
and edges.type = 'grant: edit'
and documents.type = 'collection'
where (edges.child_type = 'profiles' and edges.child_id = ?) or
(edges.child_type = 'communities' and edges.child_id in (select id from usergroups))
(查找所有类型的文档'集合'有问题的用户可以编辑,因为它们是直接添加为编辑器,或者因为它们属于被授予编辑访问权限的社区)。
答案 0 :(得分:0)
我可以在此处找到有关如何解决此问题的说明:
https://gist.github.com/ericeslinger/a83e74501e9901c8b795
基本上等于"我写了一些自定义行为并将它们扔进了bookshelf.Model的子类中,我的所有应用程序Model对象都继承自"。