Strukturyzacja relacji wielu do wielu między modelami dla szyn i szkieletu.js

Próbuję skonfigurować model item i model tag, które mają relację wiele do wielu (elementy mają wiele tagów i znaczniki należą do wielu elementów). Używam szyn i szkieletu.js, więc muszę je przechowywać, pobierać i aktualizować modele bezproblemowo między sobą. Chciałbym również, gdybym mógł zapisać nową listę tagów dla konkretnego przedmiotu za jednym razem od klienta.

Jaki jest prawidłowy sposób ułożenia modeli i kontrolerów po stronie szyn i modeli na strona szkieletowa, aby utrzymać system w spokoju i ułatwić dzielenie modeli między nimi? W szczególności, jak wyglądałoby API na serwerze i jaka byłaby reprezentacja modeli w JSON podczas ich zapisywania i pobierania?

Byłbym naprawdę wdzięczny za wszelkie porady dotyczące struktury, i tak naprawdę nie potrzebuję żadnego kodu ani szczegółów implementacji-po prostu konfiguracja wysokiego poziomu byłaby świetna. Dzięki!

Author: Chetan, 2011-07-11

2 answers

Wygląda na to, że znalazłeś odpowiedź rails. Może pomogę z kręgosłupem:

Backbone ma 2 konstrukty modelu: Model i zbiór (zbiór jest tylko listą modeli). Nie ma formalnego sposobu opisywania relacji z kręgosłupem (afaik), więc musisz to zrobić sam. Myślę, że to, co bym zrobił, aby poradzić sobie z tą strukturą, to 3 zbiory:

ItemCollection

Zbiór przedmiotów będzie zawierał wszystkie twoje przedmioty, a każdy z kolei item posiada własny TagCollection, który przechowuje powiązane z nim modele tagów.

ItemCollection.TagCollection

Przechowuje odniesienia do głównej instancji TagCollection, ale jest listą lokalną tylko dla tego elementu. Skoro możesz.dodaj ' model do kolekcji, wtedy możesz mieć wiele kolekcji z tymi samymi modelami, które je wypełniają.

TagCollection

TagCollection przechowuje Twoje tagi. Jest to "główna" lista tagów, które każdy element TagCollection odwołuje się.

Na przykład: masz 3 tagi w TagCollection i 2 elementy.

  • item_1.TagCollection ma tag_A i tag_B
  • item_2.TagCollection ma tag_A i tag_C

Jeśli, item_1 to ma do niego dodany tag_C, to po prostu: item_1.TagCollection.dodaj (tag_C) podobnie, usuwając: item_1.TagCollection.remove (tag_C) usunie go z kolekcji item_1, ale nie z innych.

Niezależnie od stosowanych metod, musisz napisać jakiś kod, aby mieć go do masowych aktualizacji / tworzy. Pamiętaj, że backbone po prostu przekazuje listę atrybutów jako ciąg JSON w treści żądania podczas synchronizacji. Nie obchodzi go, co wysyła. Tak długo, jak kontroler był skonfigurowany tak, aby akceptował listę (1 lub więcej) w metodzie create, powinieneś być w stanie to zrobić po prostu wykonując TagCollection.create([lista tagów]). Trudną częścią byłoby obejście synchronizacji szkieletu, aby obsłużyć udane tworzenie i przekształcanie [listy tagów] w poszczególne modele kolekcji.

Mam nadzieję, że to pomoże!

 7
Author: Craig Monson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 22:30:00

[oprócz odpowiedzi Papieża:]

Rails answer (z Tworzenie wielu zasobów w jednym postu RESTful w rails ) to użycie 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

Poniższe założenie zakłada, że dodałeś ActiveRecord::Base.include_root_in_json = false do jednego ze swoich inicjalizatorów(zobacz tutaj dlaczego).

Aby zapisać listę tagów dla elementu z Backbone, odpowiedź (z zapisywanie zagnieżdżonych obiektów za pomocą Rails, backbone.js, oraz accepts_nested_attributes_for) ma zastąpić sync na Model przedmiotu:

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

To rozwiązanie może wymagać nieco więcej hackerów, aby rails zrozumiał kręgosłup, ale w ten sposób zaczniesz je konfigurować.

 5
Author: Chetan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:11:55