我想在 Ember 中编写一个 Or
过滤器。我要实现的过滤器如下:
(end_date <= filter_end_date && end_date >= filter_start_date) || (start_date >= filter_start_date && start_date <= filter_end_date) || (start_date <= filter_start_date && end_date >= filter_end_date)
我将所有过滤器收集在一起,然后在发送查询时传递它:
filterOptions: [
{
name : 'state',
op : 'eq',
val : 'published'
}
]
查询如下:
return this.get('store').query('event', {
sort : 'starts-at',
filter : filterOptions
});
我浏览了文档但没有找到任何东西。对该过滤器建模的最佳方法是什么?
最佳答案
您要求的是 REST API 使用的过滤策略。这不是 ember.js 特有的。您使用的store
服务(即您使用的query
方法)是由ember-data提供的。 Ember-data 是 ember 的默认持久层,默认情况下将 ember-cli 蓝图包含到新项目中。
默认情况下,ember-data 正在实现 JSON API specification 。该规范注册了用于过滤的 filter
查询参数,但不知道所使用的过滤策略:
Note: JSON API is agnostic about the strategies supported by a server. The filter query parameter can be used as the basis for any number of filtering strategies. (Source)
只有一个过滤建议,它解决了通过关联记录的 ID 进行过滤的问题:
It’s recommended that servers that wish to support filtering of a resource collection based upon associations do so by allowing query parameters that combine filter with the association name.
For example, the following is a request for all comments associated with a particular post:
GET /comments?filter[post]=1 HTTP/1.1
ember-data 中内置的唯一过滤策略是通过所请求资源的多个 ID 进行过滤。如果使用内置 JSONAPIAdapter 且 coalesceFindRequests
option 则使用它是true
。默认为false
。在这种情况下,ember-data 将对一项资源的特定记录的多个请求合并到一个 GET 查询中,以避免触发多个查询。它使用 filter
查询参数以及用方括号括起来的用于过滤的属性 (id
) 和逗号分隔的 ID 列表。例如。对 ID 为 1 和 2 的帖子的 /posts
端点的查询如下所示: GET/posts?filter[id]=1,2
。
因此,将其放在一起,所有现有部分仅与按(关联)资源的 ID 进行过滤有关。
JSON API 规范与过滤策略无关是有充分理由的:合适的过滤策略是高度特定于应用程序的。在 REST API 上支持 SQL 的全部功能可能会给 API 带来严重的性能问题。
但是有很多复杂的过滤策略,可以实现并且非常适合 JSON API 中的推荐和 ember-data 的 coalesceFindRequests
功能。
例如 filtering syntax used by OpenStack可以被采纳。该选项允许将由冒号与值分隔开的运算符添加到过滤器中。使用该查询来请求 2018 年 1 月 1 日之后发布的所有帖子的查询将类似于:GET/posts?filter[published-at]=gt:2018-01-01
。请注意,我还假设使用驼峰式字段名称和 ISO-8601 日期字符串。但是,此语法不支持 or
运算符。对于不将 or
运算符的复杂性纳入 REST API 过滤策略存在一些争论。通过使用单独的查询并合并返回的集合,您可以轻松地获得该选项。
更复杂的过滤策略是 Resource Query Language (RQL) 。该运算符和值之间用等号分隔。因此,上面示例中使用的请求如下所示: GET/posts?filter[published-at]=gt=2018-01-01
RQL 还支持使用括号的 or
运算符将由竖线分隔的表达式分组。对 2018 年 1 月 1 日之后但 2018 年 2 月 1 日之前发布的帖子的查询如下所示: GET/posts?(filter[published-at]=gt=2018-01-01|filter[published-at]=lt= 2018-02-01)
然而,有人可能会认为这不是一种非常常见的查询参数语法,并且可能会导致 Web 服务器、缓存、代理等出现问题。
由于 ember-data 传递了 store.query()
的第二个参数直接转发至jQuery.ajax()
作为数据
设置,您可以完全自由地根据您的应用程序需求选择过滤策略。
关于javascript - 在 Ember 中编写 Or 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51007515/