Как загрузить подмодели с отношениями внешнего ключа в Backbone.js?

Извините, если это немного запутанно... Я все еще изучаю Backbone.js...

Как правильно загружать и сохранять модели Backbone, которые имеют подмодели внутри себя? (И должны ли у меня вообще быть подмодели?)

Например, (простите за кофескрипт), если у меня есть что-то вроде:

class Address extends Backbone.Model
  urlRoot: '/api/v1/address/'
  url: -> return @urlRoot+@id+'/?format=json'
  defaults: {'city': '', 'state': ''}

class Person extends Backbone.Model
  urlRoot: '/api/v1/person/'
  url: -> return @urlRoot+@id+'/?format=json'
  defaults: { name: 'Anon', address: new Address }

... and then I do this ...

dude = new Person
dude.set('id',101)
dude.fetch()
// Response returns {name: 'The Dude', address: '/api/v1/address/1998/'}
// And now, dude.get('address') is '/api/v1/address/1998' and no Address object

where = new Address
where.set('id',1998)
where.fetch()
// Response returns {city: 'Venice', state; 'CA'}

Что я хочу, так это сказать dude.fetch() и получить как чувака, так и его адрес, и когда я вызываю Backbone.sync('update',dude), я хочу сохранить оба чувак и его адрес. Как?

На бэкэнде я использую deliciouspie для создания своего API для некоторых таблиц SQLAlchemy (не Django ORM), поэтому у меня есть ресурс для моей таблицы Person и таблицы Address:

class AddressResource(SQLAlchemyResource):
    class Meta:
        resource_name = 'address'
        object_class = AddressSQLAlchemyORMClass

class PersonResource(SQLAlchemyResource):
    address = ForeignKey(AddressResource, 'address')
    class Meta:
        resource_name = 'person'
        object_class = PersonSQLAlchemyORMClass

Функция Tastypie ForeignKey создает сопоставление, которое возвращает URL< /strong> на указанный адрес.

Я попытался перегрузить функцию Dude.parse() для вызова fetch для Address(), но она не работала и казалась неправильной, вызывая всевозможные вопросы:

  1. Должен ли я изменить свой ответ на вкусный пирог, чтобы включить адрес как вложенный объект?
  2. Если я перейду на вложенный объект, должен ли я использовать backbone-relational, как в вопрос Модели, связанные с Backbone-Relational, не создаются, или это излишне ?
  3. Должен ли я перегружать функцию parse() или fetch() или создать свой собственный backbone.Sync(), чтобы получить ответ, а затем сделать это вручную?
  4. Поскольку это один к одному, должен ли я вместо этого иметь только одну модель вместо подмодели и отправлять информацию обратно вместе в одном запросе?

Есть ли стандартный способ сделать это?


person Adam Morris    schedule 16.07.2012    source источник


Ответы (1)


С Tastypie вы можете изменить ответ на вложенный объект вместо ссылки, указав full=True в определении ForeignKey:

class PersonResource(SQLAlchemyResource):
    address = ForeignKey(AddressResource, 'address', full=True)

Это возвращает объект адреса вместе с человеком.

Затем я до сих пор не знаю, наилучший ли это способ, но я переместил свою подмодель из атрибутов и перегрузил функцию parse(), чтобы установить ее, и update(), чтобы сохранить ее. , подобно:

class Person extends Backbone.Model
  address: new Address
  urlRoot: '/api/v1/person/'
  url: -> return @urlRoot+@id+'/?format=json'
  defaults: { name: 'Anon'}

  parse: (response) ->
     addressResp = response.address || {}
     addressAttr = @address.parse(addressResp)
     @address.set(addressAttr)
     return response

  update: (options) ->
     @set('address',@address.toJSON())
     Backbone.sync 'update', @, options

В этом примере я мог бы добавить адрес обратно в атрибуты и управлять им с помощью set/get, но затем в моей собственной среде я создал альтернативную функцию toJSON для отправки json на сервер и не смог найти хороший способ установить json для объекта, не меняя его с коллекции на ответ json.

person Adam Morris    schedule 16.07.2012