我有三个关联的模型: Segments 每个都有两个 GeoPoints ,关联存储为 GeoPointOnSegments 。在服务器端,这是简单的Rails代码,具有has_many:through关系。在客户端,以下是我编写的Backbone代码。 (注意:我允许客户端创建数据然后批量上传;这就是为什么有一些逻辑来处理本地和服务器ID。)
我发现的问题是,当我有数百个模型时,这段代码非常慢。具体来说,它是geo_point.coffee中的以下行:
masterRouter.geo_point_on_segments.select ...
这是在每个GeoPointOnEntry模型上进行过滤,以便找到哪些连接到给定的GeoPoint。 (请注意,可以有多个Segment连接到GeoPoint。)有关如何提高性能的任何建议吗?
我的想法:
还有其他更好的想法吗?
geo_point.coffee
class App.Models.GeoPoint extends Backbone.Model
name: 'geo_point'
getGeoPointOnSegments: ->
masterRouter.geo_point_on_segments.select (gpos) =>
if @isNew()
return gpos.get('geo_point_cid') == @cid
else
return gpos.get('geo_point_id') == @id
, this
getSegments: ->
_.compact _.map @getGeoPointOnSegments(), (gpos) =>
gpos.getSegment() unless gpos.get('markedForDelete')
getConnectedGeoPoints: ->
_.compact _.flatten _.map @getSegments(), (s) =>
s.getGeoPoints() unless s.get('markedForDelete')
geo_point_on_segment.coffee
class App.Models.GeoPointOnSegment extends Backbone.Model
name: 'geo_point_on_segment'
getGeoPoint: ->
if local = masterRouter.geo_points.getByCid(@get 'geo_point_cid')
return local
else if server = masterRouter.geo_points.get(@get 'geo_point_id')
return server
getSegment: ->
if local = masterRouter.segments.getByCid(@get 'segment_cid')
return local
else if server = masterRouter.segments.get(@get 'segment_id')
return server
segment.coffee
class App.Models.Segment extends Backbone.Model
name: 'segment'
getGeoPointOnSegments: ->
_.compact masterRouter.geo_point_on_segments.select (gpos) =>
if gpos.isNew()
return gpos.get('segment_cid') == @cid
else if gpos.get('markedForDelete')
return null
else
return gpos.get('segment_id') == @id
, this
getGeoPoints: ->
_.map @getGeoPointOnSegments(), (gpos) =>
gpos.getGeoPoint() unless gpos.get('markedForDelete')
答案 0 :(得分:0)
我认为最好不要在Backbone中使用关系模型GeoPointOnSegment
。
我想要的结构是:
如果从JSON实例化数据时,您可以执行以下操作:
此外,当您创建新细分时,您必须维护这些关联。
它是一个客户端索引,但已集成在模型中。