让我们说我有一个包含许多选择的问题模型,基本上是一个问题到多个选择。 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
创建一个方法,然后只返回question
个对象的平面列表。但这是一个好习惯吗?
答案 0 :(得分:1)
如评论中所述;对于数据集/数据库上更复杂的查询,在控制器中创建操作非常有意义。操作绑定到应用程序中的路由,以便在客户端请求路由时,执行操作以执行某些业务逻辑并发送响应。
关于您的疑虑:
在我的选择模型本身获得新关系之前,这一切都很好, 因此再次嵌套列表。
如果您使用的是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
defaultLimit: 20
在config / routes.js
中按路由设置路径限制"GET /question": {blueprint: populate_limit: 20}
或使用请求中的url参数
"&limit=10"