Структурирование отношений «многие ко многим» между моделями для Rails и Backbone.js - PullRequest
14 голосов
/ 11 июля 2011

Я пытаюсь настроить модель item и модель tag, которые имеют отношение «многие ко многим» (элементы имеют несколько тегов, а теги принадлежат нескольким элементам). Я использую Rails и Backbone.js, поэтому мне нужно, чтобы они хранили, извлекали и обновляли модели беспрепятственно между собой. Мне бы также понравилось, если бы я мог сохранить новый список тегов для определенного элемента за один раз от клиента.

Какой правильный способ структурировать модели и контроллеры на стороне Rails и модели на стороне Backbone, чтобы поддерживать систему RESTful и облегчать обмен моделями между ними? В частности, как будет выглядеть API на сервере, и каким будет представление моделей в JSON при их сохранении и извлечении?

Я был бы очень признателен за любые советы по структуре, и мне не нужны были бы какие-либо детали кода или реализации - просто была бы полезна установка высокого уровня. Спасибо!

Ответы [ 2 ]

7 голосов
/ 12 июля 2011

Похоже, вы нашли ответ на свой вопрос.Может быть, я могу помочь со стороной магистрали:

У магистрали есть 2 конструкции модели: Модель и Коллекция (коллекция просто является списком моделей).Не существует формального способа описания отношений с магистралью (afaik), поэтому вы должны сделать это самостоятельно.Я думаю, что я бы сделал для обработки этой структуры 3 коллекции:

ItemCollection

Коллекция элементов будет содержать все ваши элементы, и каждый элемент, в свою очередь, будет иметь свою собственную коллекцию TagCollection., который содержит связанные с ним модели тегов.

ItemCollection.TagCollection

Содержит ссылки на основной экземпляр TagCollection, но является локальным списком только для этого элемента.Поскольку вы можете '.add' модель в коллекцию, вы можете иметь несколько коллекций с одинаковыми моделями, заполняющими их.

TagCollection

TagCollection содержит ваши теги.Это «основной» список тегов, на который будет ссылаться каждая ItemCollections TagCollection.

Например: у вас есть 3 тега в вашем TagCollection и 2 элемента.

  • item_1.TagCollection имеет tag_Aи tag_B
  • item_2.TagCollection имеет tag_A и tag_C

Если к item_1 добавлен tag_C, вы просто: item_1.TagCollection.add (tag_C) Аналогично, удаливitem_1.TagCollection.remove (tag_C) удалит его из коллекции item_1, но не из других.

Независимо от используемых вами методов, вам потребуется написать некоторый код, чтобы он мог выполнять массовые обновления /создает.Помните, что магистраль просто передает список атрибутов в виде строки JSON в теле запроса, когда выполняет синхронизацию.Неважно, что он посылает.Итак, если ваш контроллер настроен на прием списка (1 или более) в его методе create, вы сможете сделать это довольно просто, выполнив TagCollection.create ([список тегов]).Трудной частью было бы переопределить синхронизацию магистрали для успешного создания и превратить [список тегов] в отдельные модели для коллекции.

Надеюсь, это поможет!

5 голосов
/ 13 июля 2011

[В дополнение к ответу Папы:]

Для справки, ответ Rails (из Создание нескольких ресурсов в одном RESTful POST в рельсах ) должен использовать accepts_nested_attributes_for:

class Item < ActiveRecord::Base
  has_many_and_belongs_to :tags
  accepts_nested_attributes_for :tags
end

class Tag < ActiveRecord::Base
  has_many_and_belongs_to :items
end

В следующем предполагается, что вы добавили ActiveRecord::Base.include_root_in_json = false к одному из ваших инициализаторов (см. здесь , почему).

Чтобы сохранить список тегов дляДля элемента из Backbone ответ (из Сохранение вложенных объектов с помощью Rails, backbone.js и acceptpts_nested_attributes_for ) заключается в переопределении sync в модели элемента:

sync: (method, model, options) ->
    data = JSON.stringify model.toJSON()
    if (method == "create" || method == "update")
        json = model.attributes
        json = _.extend json, {tags_attributes: model.tags.toJSON()}
        data = JSON.stringify json

    options.data = data
    options.contentType = 'application/json'
    Backbone.sync method, model, options

Это решениеможет потребоваться немного больше хакеров, чтобы Rails понял Backbone, но именно так вы бы начали их настраивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...