Sails.js 延迟加载模型
Sails.js lazy loading models
假设我有一个问题模型,其中包含许多要回答的选项,基本上是一个问题到多个选项。
Sails 自动为问题和选择模型公开一个 RESTful 列表视图,但每个端点也会自动列出所有关联关系,如下所示:
呼叫 GET /question
:
{
"choices": [
{
"createdAt": 1520183091725,
"updatedAt": 1520183091725,
"id": 1,
"text": "This is an answer",
"votes": 1,
"associatedQuestion": 1
}
],
"createdAt": 1520183061263,
"updatedAt": 1520183061263,
"id": 1,
"text": "This is a question"
}
这一切都很好,直到我的 choice
模型自己获得新的关系,因此再次嵌套列表。
有什么方法可以告诉 Sails 哪些属性不应在默认 REST 路由中发送?我想我可以在我的 QuestionController
上创建一个使用 find
的方法,然后它只会 return 一个 question
对象的平面列表。但这是一个好习惯吗?
如评论中所述;对于 dataset/database 上更复杂的查询,在控制器中创建一个操作很有意义。动作绑定到应用程序中的路由,以便当客户端请求路由时,执行动作以执行一些业务逻辑并发送响应。
关于您的顾虑:
That's all fine until my choice model gets new relations itself,
therefore nesting the list again.
如果您使用的 Sails 版本 < v1. Sails 仅填充一个模型深度。嵌套人口不包括在内。所以不用担心。
如果您使用的是 Sails >= v1。您可以创建自己的控制器操作来限制这种情况。依赖于数据库,这可以使用 Waterline 查询语言完成,或者如果使用 RDMS,.native()/.query() 方法直接调用底层数据库驱动程序。例如,使用 MySQL:
Question.query("SELECT * " +
"FROM question " +
" JOIN choices " +
" ON question.id = choices.id " +
"WHERE question.id = "+req.param('id')+"; ").exec...
离题但与我们在评论中的讨论相关。
要限制从路由或动作控制器返回的结果数量,您可以:
在config/blueprints.js
中设置全局默认限制
defaultLimit: 20
在config/routes.js
中逐个路由设置限制
"GET /question": {blueprint: populate_limit: 20}
或者在请求中使用url参数
"&limit=10"
假设我有一个问题模型,其中包含许多要回答的选项,基本上是一个问题到多个选项。 Sails 自动为问题和选择模型公开一个 RESTful 列表视图,但每个端点也会自动列出所有关联关系,如下所示:
呼叫 GET /question
:
{
"choices": [
{
"createdAt": 1520183091725,
"updatedAt": 1520183091725,
"id": 1,
"text": "This is an answer",
"votes": 1,
"associatedQuestion": 1
}
],
"createdAt": 1520183061263,
"updatedAt": 1520183061263,
"id": 1,
"text": "This is a question"
}
这一切都很好,直到我的 choice
模型自己获得新的关系,因此再次嵌套列表。
有什么方法可以告诉 Sails 哪些属性不应在默认 REST 路由中发送?我想我可以在我的 QuestionController
上创建一个使用 find
的方法,然后它只会 return 一个 question
对象的平面列表。但这是一个好习惯吗?
如评论中所述;对于 dataset/database 上更复杂的查询,在控制器中创建一个操作很有意义。动作绑定到应用程序中的路由,以便当客户端请求路由时,执行动作以执行一些业务逻辑并发送响应。
关于您的顾虑:
That's all fine until my choice model gets new relations itself, therefore nesting the list again.
如果您使用的 Sails 版本 < v1. Sails 仅填充一个模型深度。嵌套人口不包括在内。所以不用担心。
如果您使用的是 Sails >= v1。您可以创建自己的控制器操作来限制这种情况。依赖于数据库,这可以使用 Waterline 查询语言完成,或者如果使用 RDMS,.native()/.query() 方法直接调用底层数据库驱动程序。例如,使用 MySQL:
Question.query("SELECT * " +
"FROM question " +
" JOIN choices " +
" ON question.id = choices.id " +
"WHERE question.id = "+req.param('id')+"; ").exec...
离题但与我们在评论中的讨论相关。
要限制从路由或动作控制器返回的结果数量,您可以:
在config/blueprints.js
中设置全局默认限制defaultLimit: 20
在config/routes.js
中逐个路由设置限制"GET /question": {blueprint: populate_limit: 20}
或者在请求中使用url参数
"&limit=10"