按 ember 中的属性获取记录

Getting records by attribute in ember

在我的应用程序路由中,我获得了当前会话和用户。

/routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({

    beforeModel: function() {
      return this.get('session').fetch().catch(function() {});
    },
    model () {
      return this.store.findRecord('user', this.get('session.currentUser.uid'));
    }
});

我的模型是这样设置的:

/models/bet.js

import DS from 'ember-data';

export default DS.Model.extend({
  created: DS.attr('date'),
  user: DS.belongsTo('user', { async: false })
});

/models/user.js

import DS from 'ember-data';

export default DS.Model.extend({
  email: DS.attr('string'),
  firstName: DS.attr('string'),
  lastName: DS.attr('string'),
  bets: DS.hasMany('bet', { async: true })
});

在我的 /bets 路线中,我只想加载 user == session.currentUser.uid 的赌注或类似的方式来仅获取 belongTo 当前用户的 bets

我已经尝试找到最好的方法来做到这一点,但没有结果。

您在使用 Ember 简单验证吗?如果是这样,您的请求将发送可用于根据提供的信息获取当前用户的令牌。由于 return 只有当前用户的投注是默认行为,因此将逻辑保持在 api 方面是个好主意。任何其他类型的过滤器都应使用查询或查询记录方法完成。

最简单的方法是将所有赌注过滤到您想要的赌注。基于 api 的解决方案可能是 1) 在对服务器的请求中使用查询参数,2) 嵌套 url,如 /users/2/bets。无论哪种情况,您都必须在服务器上实现它。

示例 1) 过滤器

import Ember from 'ember';

export default Ember.Route.extend({
  model () {
    return this.store.findAll('bet').then((bets) => {
      const currentUserId = this.get('session.currentUser.uid')
      return bets.filter((bet) => {
        return bet.get('user.id') === currentUserId
      })
    });
  }
});

示例 2) 查询。您的服务器将必须接受 res

import Ember from 'ember';

export default Ember.Route.extend({
  model () {
    return this.store.query('bet', {
      userId: this.get('session.currentUser.uid')
    })
  }
});

示例 3) 嵌套属性。 为此,您需要两件事:

  1. 用户带有这样的 links 属性:`{bets: 'api/users/:uid/bets'}
  2. 您的服务器必须能够响应请求 /api/users/:uid/bets 并且 return 只有用户的投注

代码:

import Ember from 'ember';

export default Ember.Route.extend({
  model () {
    const currentUser this.store.peekRecord('user', this.get('session.currentUser.uid'))
    return currentUser.get('bets') // sends request to `api/users/:uid/bets`
  }
});