首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >延迟加载模型中的关联

延迟加载模型中的关联
EN

Stack Overflow用户
提问于 2014-05-10 08:29:37
回答 4查看 290关注 0票数 1

在我的Ember.js应用程序中,我有一个类似于以下内容的模型:

代码语言:javascript
复制
MyApp.Game = DS.Model.extend({
  season_type:            DS.attr('string'),
  gamedate:               DS.attr('date'),
  home_team_name:         DS.attr('string'),
  visiting_team_name:     DS.attr('string'),
  gametime:               DS.attr('string'),
  home_team:              DS.belongsTo('team'),
  visiting_team:          DS.belongsTo('team'),
  home_team_pitcher:      DS.belongsTo('player'),
  visiting_team_pitcher:  DS.belongsTo('player'),
  home_players:           DS.hasMany('player'),
  visitor_players:        DS.hasMany('player')
});

这在控制器"A“中工作得很好。在另一个控制器中,我们称它为控制器"B",理想情况下,我应该有另外两个属性可用,如下所示:

代码语言:javascript
复制
MyApp.Game = DS.Model.extend({
  season_type:            DS.attr('string'),
  gamedate:               DS.attr('date'),
  home_team_name:         DS.attr('string'),
  visiting_team_name:     DS.attr('string'),
  gametime:               DS.attr('string'),
  home_team:              DS.belongsTo('team'),
  visiting_team:          DS.belongsTo('team'),
  home_team_pitcher:      DS.belongsTo('player'),
  visiting_team_pitcher:  DS.belongsTo('player'),
  home_players:           DS.hasMany('player'),
  visitor_players:        DS.hasMany('player'),
  home_all_players:       DS.hasMany('player'),
  visitor_all_players:    DS.hasMany('player')
});

在本例中,我添加了home_all_playersvisitor_all_players。在这两个属性中有大量的数据需要跨越,我希望避免将其用于面向客户的控制器A。另一方面,控制器B是一个管理界面,管理员需要拥有home_all_playersvisitor_all_players的访问权限,以便他们可以更新MLB球队的阵容。

处理这个问题的最干净的方法是什么?我猜在服务器端,在我使用Ruby on Rails的地方,我只会让序列化程序包含home_all_playersvisitor_all_players,这取决于调用的路由。但是Ember.js端的建模保持不变,所以我不确定解决这个问题的最好方法是什么。

EN

回答 4

Stack Overflow用户

发布于 2014-05-13 02:56:47

我认为,这取决于你的整个应用流程和交互,如果你希望你的用户经历任何转换延迟或特定的用户体验,你需要访问一组特定的数据。

一般来说,我的后端负责为它的客户端提供最方便的API,这样他们就可以交付最好的UX,出于这个目的,你可以使用嵌入的数据,侧载的资源,新的资源定义,等等。

我在三种不同的方式上做了类似的事情:

1)发送查询参数,以便服务器知道如何序列化资源。

代码语言:javascript
复制
store.find('game', {id: 1, extend:'admin'});
store.find('game', {extend:'admin'});

2)基于您当前的用户身份验证,您的服务器可以知道应该如何序列化资源。

代码语言:javascript
复制
//the server response would be different based on the auth header 
store.find('game', 1);
store.find('game');

3)添加一个新的资源来扩展您的资源。

代码语言:javascript
复制
MyApp.ExtendedGame = DS.Model.extend({
  game:                   DS.belongsTo('game'),
  home_all_players:       DS.hasMany('player'),
  visitor_all_players:    DS.hasMany('player')
});
票数 0
EN

Stack Overflow用户

发布于 2014-05-13 22:08:35

我想你需要扩展你的模型。

代码语言:javascript
复制
App.Game = DS.Model.extend({
  ...
});

App.AdminGame = App.Game.extend({
  home_players:           DS.hasMany('player'),
  visitor_players:        DS.hasMany('player')
});

在本例中,您将拥有两个控制器和相关路由,它们是AdminGameController、GameController、GameRoute和AdminGameRoute。

您应该从相关路由中的服务器获取适当的模型。Rails应该根据控制器返回正确的模型。

票数 0
EN

Stack Overflow用户

发布于 2014-05-17 04:39:22

我使用查询参数,在rails端,ActiveModel::Serializer决定是否包含字段、字段数量、排序顺序等。我不确定我是否会考虑在客户端使用不同的控制器。

我即将开始一个类似的功能,更一般地对大量数据进行分页。我现在的想法是扩展DS.ManyArray并在meta中添加一些数据,包括loaded_counttotal_countoffset等,所有这些都可以由API返回。默认值可能是加载20条记录,然后可以调用函数来添加更多记录,或者将窗口移动到另一个范围,以保持对内存的控制。或者,通过查询参数,将它们全部加载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23575932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档