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!
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!
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życieaccepts_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ć.
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