2014-11-23 90 views
1

我的设置:Rails的STI和多态性灰烬JS

Rails 4.1 with active-model-serializer gem 
Ember 1.9.0 
Ember-Data 1.0.0 beta with ActiveModelAdapter used as ApplicationAdapter 

我有性病的表称为乔布斯有许多亚型。每个作业都有许多LineItems。我在Rails中使用ActiveModelSerializers以Ember-Data理解的方式序列化我的JSON数据。我的模型都建立了这种方式的Rails:

class Job < ActiveRecord::Base 
    has_many :line_items 
    ... 
end 
class DisposalJob < Job 
    ... 
end 
class SupplyJob < Job 
    ... 
end 
class LineItem < ActiveRecord::Base 
    belongs_to :job, polymorphic: true 
    ... 
end 

而且这种方式在灰烬:

App.Job = DS.Model.extend 
    line_items: DS.hasMany "line_item" 
    ... 

App.DisposalJob = App.Job.extend 
    ... 

App.SupplyJob = App.Job.extend 
    ... 

App.LineItem = DS.Model.extend 
    job: DS.belongsTo "job", 
    polymorphic: true 

我在Rails的序列化器设置像这样:

class BaseSerializer < ActiveModel::Serializer 
    ActiveModel::Serializer.setup do |config| 
    config.embed = :ids 
    config.embed_in_root = true 
    end 
end 

class JobSerializer < BaseSerializer 
    ... 
    has_many :line_items 
end 

class DisposalJobSerializer < JobSerializer 
    ... 
end 

class SupplyJobSerializer < JobSerializer 
    ... 
end 

class LineItemSerializer < BaseSerializer 
    belongs_to :job, polymorphic: true 
end 

我的问题是当我尝试将line_item保存到作业子类(我不直接使用Job类)时,Ember拒绝发现DisposalJob是一种作业,并且抛出一个错误消息,预期它将保存“作业”记录到那个关系,而不是一个“DisposalJob”或“SupplyJob”,尽管这些都是Job的子类。我是Ember新手,所以任何帮助将不胜感激。

编辑:这里是当尝试一个DisposalJob保存在灰烬上的LineItem的工作关系,我得到的错误:

Uncaught Error: Assertion Failed: You can only add a 'job' record to this relationship 

编辑:我试过这个重构,使LINE_ITEM同时接受JOB_ID和工作类型而不仅仅是job_id。 Ember仍然告诉我它期待在这种关系中有一份“工作”记录。我已经尝试了通过消除“属于在余烬一方的belongsTo”,并且只有line_item包含job_id:DS.attr“number”和job_type:DS.attr“string”来避免这个问题。这允许我保存记录,但是没有属于关联协会,行项目将不会被发现时,恩贝尔显示它们连接到工作。

回答

1

如果已经启用MODEL_FACTORY_INJECTIONS您将无法为原型基于继承检查失败使用子类Issue #5573Issue #2342和。Issue #2316

我发现在与Ember.Data模型层做STI确实Ember.Model是不是真的可行,原因如下:

  1. 就商店而言,每个模型子类都是一个单独的集合。
  2. 由于1.您不能查询商店以获取包含全部(或仅部分)子类的聚集结果集。你可以在理论上解决这个问题,通过查询每个所需的子类的商店,并使用Ember.computed.union()/ Ember.computed.uniq()合并结果,但它不会很有效。
  3. Ember无法动态扩展对象实例带有具有属性的mixin,这可能是另一种通过基于模型数据中的类型属性扩展模型实例来处理STI的方法。

所以,你剩下的东西就是像你在服务器上的数据库中那样对待事物,这就是支持数据模型中的所有可能性。这意味着只需定义所有可能的关系和属性。

当涉及验证和其他业务规则时,控制器可以提供您需要的外观。Ember的方式是让控制器来装饰模型,你可以创建不同类型的控制器来装饰你喜欢的模型。

+0

是的,我们最终放弃它支持Rails的默认UJS项目,灰烬是不是真的工作了为我们这些非常原因。感谢您的回答。 – 2015-02-06 07:53:33