Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

butanfire avatar butanfire 32 Точки

Kinvey Data Relation

Привет на всички,

Извинявам се предварително, понеже е възможно това да е било разисквано/обсъждано вече.

Малко е късно либе за китка, но имам следният въпрос :

Както в примера с книгите и коментарите по JS (началото на курса), в краят на упражнението по JS беше дадено :

Add functionality to add comments for each book. You may add additional table row to display the comments:

Дотук добре, като стигнем до този момент :

A better approach would be to have two collections “books” and “comments” and to reference the “book” entity from “comments” entity, as it is described in the Kinvey documentation:

Поиграх си с Kinvey доволно време, и разгледах доста документацията им  http://devcenter.kinvey.com/rest/guides/datastore#RelationalData.

Сега проблема идва, че :

An app must define the following attributes for setting up a reference.

Name Type Value
_type string KinveyRef
_id string _id of the entity referred to
_collection string name of the collection that stores the entity referred to

В случая да кажем, че направим библиотека с книги, и за всяка книга коментари, както в упражнението.

Което реално значи :

_id в Kinvey се създава автоматично, само когато Kinvey приеме данните, демек като създадеш коментара.

За книгата : _id-то може да кажем, че може да го направим пвсевдо-уникално като "име на книга" + "автор".

За коментара : няма как да е уникално ID-то, освен "име на автора" + "datetime"?

 

Добре, да оставим и горният проблем настрана - като създаваме коментара, как го асоцираме със съответната книга?
Попринцип post-ваме коментара по ID-то на книгата, как взимаме ID-то на книгата? Неможем по име, понеже името не е уникално.
Защото като list-ваме книгите, ние никъде не пазим ID-тата на книгите - трябва нова GET заявка да вземем на коментара parent-a (ако сме с таблици)?

Глобална променлива може да помогне, ама нещо връзката м/у колекциите ме бърка и какво да се прати към Kinvey? (за да може да се get-не после и да се resolve-ва)

 

Поздрави,

Влади

Тагове:
Innos avatar Innos 419 Точки
Best Answer

Книгата ти е някакъв JSON обект, можеш в него да имаш property с ключ примерно comments и стойност масив: 

{
   "name":"Harry Potter and the Chamber of Secrets",
   "comments":[]
}

коментарите също ще са JSON обекти, една книга с коментари би изглеждала така:

{
   "name":"Harry Potter and the Chamber of Secrets",
   "comments":[
                 {
                    "title":"Random Comment",
                    "author":"Pesho"
                 },
                 {
                    "title":"Another Comment",
                    "author":"Gosho"
                 }
              ]
}

Сега ако искаш да използваш data relation може вместо да държиш истинските коментари в comments масива да държиш референции към тях в друга база:

{
   "name":"Harry Potter and the Chamber of Secrets",
   "comments":[
                 {
                    "_type": "KinveyRef",
                    "_id": <id of the comment here>,
                    "_collection": "comments"
                 },
                 {
                    "_type": "KinveyRef",
                    "_id": <id of the comment here>,
                    "_collection": "comments"
                 }
              ]
}

На въпроса как вземаш id-то на книга, отговора е че обикновено го пазиш в HTML-a. Когато направиш заявката за вземане на книгите получаваш и id-тата им, докато си попълваш HTML елементите със информацията на книгите много лесно може да вкараш един custom attribute на div тага примерно който ще държи дадена книга и да го запазиш там (примерно "book-id:<bookId>"). Така като искаш да направиш някаква работа по дадена книга, примерно да промениш някакъв нейн параметър (заглавие, автор и т.н.) или да и покажеш коментарите, просто вземаш id-то от div елемента.

Ако си запазил елементите по горният начин и искаш да вземеш книга с коментарите и (тоест да резолвнеш референциите и) трябва просто към заявката да прибавиш още няколко параметъра:
<url-то на стандартна GET заявка за книгите> + "?resolve=comments&retainReferences=false"
RetainReference = false се използва за да подмени тотално референцията с обекта под нея (иначе просто ги подпъхва в ново проперти "_obj").

Само внимавай като правиш по-нататъчни операции с тях че можеш да прецакаш работата супер лесно. Примерно искаш да смениш на някоя книга името, обаче ако я вземаш със resolve-ване ще получиш обект, който на мястото на референциите има истинските елементи. Понеже PUT заявката иска да и върнеш обратно обекта с променените му стойности, като го put-неш обратно ще пренапишеш референциите със истинските обекти (защото си ги resolve-нал в GET заявката) и язък за data relation-a.

1
31/08/2016 23:04:10
butanfire avatar butanfire 32 Точки

Добро утро,

Много благодаря за отговора.

Оправих нещата, мъчих , накрая ми зареждаше коментарите накрая - причината беше че имах 2 AJAX заявки.

Втората не беше нужна, понеже едната таблица има референция (демек има всички необходими данни от другата) и ставаше асинхронизация :))))

Остана само да направя работата със коментара да взима ID-то на рецептата при създаване.

 

Темата може да се затвори.

 

Поздрави,

Владo

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.