按 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) 嵌套属性。
为此,您需要两件事:
- 用户带有这样的
links
属性:`{bets: 'api/users/:uid/bets'}
- 您的服务器必须能够响应请求
/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`
}
});
在我的应用程序路由中,我获得了当前会话和用户。
/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) 嵌套属性。 为此,您需要两件事:
- 用户带有这样的
links
属性:`{bets: 'api/users/:uid/bets'} - 您的服务器必须能够响应请求
/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`
}
});