Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ember JS中的Rails STI和多态性_Ruby On Rails_Ember.js_Polymorphism_Ember Data_Sti - Fatal编程技术网

Ruby on rails Ember JS中的Rails STI和多态性

Ruby on rails Ember JS中的Rails STI和多态性,ruby-on-rails,ember.js,polymorphism,ember-data,sti,Ruby On Rails,Ember.js,Polymorphism,Ember Data,Sti,我的设置: Rails 4.1 with active-model-serializer gem Ember 1.9.0 Ember-Data 1.0.0 beta with ActiveModelAdapter used as ApplicationAdapter 我有一个名为Jobs的STI表,它有许多子类型。每个作业都有许多行项目。我在Rails中使用ActiveModelSerializer以Ember data能够理解的方式序列化JSON数据。我的模型在Rails中的设置方式如下:

我的设置:

Rails 4.1 with active-model-serializer gem
Ember 1.9.0
Ember-Data 1.0.0 beta with ActiveModelAdapter used as ApplicationAdapter
我有一个名为Jobs的STI表,它有许多子类型。每个作业都有许多行项目。我在Rails中使用ActiveModelSerializer以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
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

编辑:我已经尝试过重构它,以便行\项同时接受作业\ id和作业\类型,而不仅仅是作业\ id。Ember仍然告诉我,它希望在这个关系中有一个“作业”记录。我已经尝试通过删除余烬端的“belongsTo”来回避这个问题,只需让行项目包含job\u id:DS.attr“number”和job\u type:DS.attr”字符串“。这允许我保存记录,但如果没有belongsTo关联,当Ember显示它们所附加到的作业时,将找不到行项目。

如果启用了模型工厂注入,则将无法使用子类,因为基于原型的继承检查失败并且失败

我发现在模型层使用Ember.Data和Ember.model进行STI实际上并不可行,原因如下:

  • 就存储而言,每个模型子类都是一个单独的集合
  • 因为1。您不能通过查询存储来获得包含所有(或仅部分)子类的聚合结果集。理论上,您可以通过查询每个所需子类的存储并使用Ember.computed.union()合并结果来解决这个问题,但这样做效率不高
  • Ember无法使用具有属性的mixin动态扩展对象实例,这是通过基于模型数据中的type属性扩展模型实例来处理STI的另一种方法
  • 因此,剩下的就是像对待服务器上的数据库一样处理事情,即支持数据模型中的所有可能性。这意味着只需定义所有可能的关系和属性


    当涉及到验证和其他业务规则时,控制器可以提供您需要的外观。Ember的方式是让控制器装饰模型,你当然可以创建不同的控制器类来装饰模型。是的,我们最终放弃了它,转而支持Rails的默认UJS,Ember并没有真正为我们工作,正是因为这些原因。谢谢你的回答。
    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
    
     Uncaught Error: Assertion Failed: You can only add a 'job' record to this relationship