【发布时间】:2017-07-25 15:37:07
【问题描述】:
我们已经在 Rails 中使用 ActionCable 在我们的应用程序中成功实现了实时更新,并在 Ember CLI 中将消费者实现为客户端服务,但我们正在寻找一种更好、更便宜的方法。
app/models/myobj.rb
has_many :child_objs
def after_commit
ActionCable.server.broadcast("obj_#{self.id}", model: "myobj", id: self.id)
self.child_objs.update_all foo: bar
end
app/models/child_obj.rb
belongs_to :myobj
def change_job
self.job = 'foo'
self.save
ActionCable.server.broadcast("obj_#{self.myobj.id}", model: "child_obj", id: self.id)
end
前端/app/services/stream.js 在这里,我们从广播中获取模型和 id 数据,并使用它从服务器重新加载。
import Ember from 'ember';
export default Ember.Service.extend({
store: Ember.inject.service(),
subscribe(visitId) {
let store = this.get("store")
MyActionCable.cable.subscriptions.create(
{channel: "ObjChannel", id: objId}, {
received(data) {
store.findRecord(data.model, data.id, {reload: true});
}
}
);
},
});
这种方法“有效”,但感觉很幼稚并且资源密集,每次更新都会再次访问我们的服务器,这需要重新验证请求,从数据库中获取数据,重新序列化对象(这可能会有额外的数据库拉取),然后通过网络发送。如果请求数量很高,这实际上会导致池和限制问题。
我认为我们可能会在 Rails 广播中发送模型、id 和变更集 (self.changes),并让 Ember 端句柄设置适当的模型属性。这是正确的方法,还是有其他人推荐的方法?
【问题讨论】:
标签: ruby-on-rails ember.js actioncable