2014-11-23 2 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 

У меня есть таблица STI под названием Работа, которая имеет много подтипов. Каждое задание имеет множество строк. Я использую ActiveModelSerializers в Rails для сериализации данных JSON таким образом, который понимает Ember-Data. Мои модели настроены таким образом, в 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 является типом задания и выдает ошибку, которая ожидает, что запись «Job» будет сохранена к этому отношению, а не к «DisposalJob» или «SupplyJob», несмотря на то, что это оба подкласса Job. Я новичок в Ember, поэтому любая помощь будет очень признательна.

EDIT: Вот ошибка я получаю при попытке сохранить DisposalJob в отношении работы по LineItem в Эмбер:

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

EDIT: Я пытался рефакторинга это так, что Line_Item принимает как job_id и job_type а не просто job_id. Эмбер все еще говорит мне, что он ожидает записи о работе в этом отношении. Я попытался обойти эту проблему, исключив «принадлежит на стороне ember и просто включил line_item job_id: DS.attr» number »и job_type: DS.attr« string ». Это позволяет мне сохранить запись, но без belongsTo ассоциации, линия-элементы не будут найдены, когда Эмбер показывает работу, которую они прикрепляются к.

ответ

1

Если MODEL_FACTORY_INJECTIONS включен, то вы не сможете использовать подклассы в качестве проверки наследования на основе прототипа неудачи Issue #5573 и Issue #2342 и . Issue #2316

я нашел делаю STI на уровне модели с Ember.Data и действительно Ember.Model не очень работоспособный по следующим причинам:

  1. Каждый подкласс класса является отдельной коллекцией в отношении магазина.
  2. Becasue of 1. вы не можете запросить магазин, чтобы получить агрегированный набор результатов, который включает в себя все (или только некоторые) подклассы. Вы могли бы теоретически обходиться с этим путем запроса хранилища для каждого из желаемых подклассов и слияния результата с использованием Ember.computed.union()/Ember.computed.uniq(), но это не будет эффективным.
  3. Ember не может динамически расширять объект экземпляров со смешинами, которые имеют свойства, что было бы другим способом обработки STI, расширяя экземпляр модели на основе атрибута type в данных модели.

Так что вы остались с тем, чтобы относиться к таким вещам, как вы, в БД на своем сервере, что поддерживает все возможности в вашей модели данных. Это означает просто определить все возможные отношения и атрибуты.

Когда дело касается проверки и других бизнес-правил, контроллеры могут предоставить необходимый вам фасад.Режим Ember предназначен для того, чтобы контроллеры могли украшать модели, и вы, безусловно, можете создать различные классы контроллеров для украшения моделей, как вам угодно.

+0

Да, мы в конечном итоге отказались от этого проекта в пользу UJS по умолчанию Rails, Эмбер на самом деле не работал для нас по этим причинам. Спасибо за Ваш ответ. –

Смежные вопросы