javascript - 在 Ember 中编写 Or 过滤器

标签 javascript database ember.js ember-data

我想在 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

Source

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/

相关文章:

django - 带有管理站点的 Ember 应用程序

javascript - Vue.js 和 vue-i18n,从 $ajax 到对象文字的 json

php - mysql_fetch_array 是mysql_fetch_assoc 和mysql_fetch_row 的组合吗?

php - MySQL Left Join、Group By、Order By、Limit = 糟糕的性能

java - 与两个数据库交互的查询性能问题

ember.js - 如何设置 mocha 测试来运行 Ember 初始值设定项以便定义注入(inject)对象?

javascript - ember.js 显示项目列表,每个项目都有自己的 View / Controller

javascript - “for”循环未正确循环对象数组

javascript - Google Geochart - 无法将区域设置为特定省份

javascript - 我想使用 Angular js 根据特定的时间和日期在 ionic 中进行本地通知