2012-01-02 17 views
6

Estoy intentando que el complemento backbone-relational trabaje con una asociación entre tareas y mensajes. (Una tarea tiene muchos mensajes).Backbone-relational: la clave de asociación no funcionará a menos que sea la misma que la clave externa

La información se extrae de un sitio estándar carriles/activerecord, que tiene un campo task_id como la clave externa.

El problema es que backbone-relational no rellenará el campo 'mensajes' con ningún mensaje en el modelo de tarea a menos que establezca la clave como "task_id" en la relación inversa ... pero eso significa que, al acceder la tarea del modelo de Mensaje, el campo task_id se rellena con el objeto de tarea real, no el entero 'task_id', que se sobrescribe.

Supongo que hay una manera simple de especificar task_id como la clave externa con la cual determinar la tarea primaria, pero tener el objeto que esa tecla representa colocado en un campo diferente (por ejemplo, 'tarea' en el objeto de mensajes). ..pero no puedo entender cómo. Cualquier idea apreciada. Código de abajo

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: true 
    } 
    }] 
+0

Por favor, ¿cómo resolvió su problema? Abrí el siguiente problema en github por la misma razón. Gracias. [Clave externa poblada con un objeto] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

Respuesta

3

Puede utilizar keySource o keyDestination para solucionar su problema en particular.

Ejemplo

En el siguiente ejemplo, supongamos que estamos recibiendo datos de una base de datos relacional de la vieja escuela, donde hay una relación de uno a muchos entre Monster y Loot_Item. Esta relación se expresa con una clave externa Monster_Id en la tabla Loot_Item. Supongamos también que nuestro servicio REST no hace ningún nesting de datos de pantalones de fantasía para nosotros, ya que parece coincidir bastante estrechamente con la situación en su pregunta.

keySource

Ahora, vamos a configurar set "keySource" a mi clave externa ("Monster_Id") y "clave" para el nombre del atributo donde quiero los datos reales para ir (por ejemplo, "Monster")Si interrumpe el depurador, verá en el objeto de atributos que, de hecho, hay un campo llamado "Monstruo", y que señala los datos del modelo de monstruo. Hey, genial!

includeInJSON

Sin embargo, si toJSON ese cachorro, adivina qué? ¡Ha puesto toda la información del monstruo en Monster_Id, como tú no querías! GAH! Podemos solucionarlo estableciendo "includeInJSON" en "Monster_Id". Ahora, cuando se convierte a JSON, devuelve la ID adecuada al campo Monster_Id, cuando está serializando sus datos en JSON, para enviarlos al servidor.

¿Problema resuelto? Er, bueno, en realidad, no necesariamente ...

Claves clínicas: Todo esto suena súper útil, pero hay un problema bastante evidente que he encontrado con este escenario. Si está utilizando un motor de plantillas (como el de Underscore.js) que requiere que convierta su modelo a JSON, antes de pasarlo a la plantilla, gritos, no tiene acceso a sus datos relacionales. Por desgracia, el JSON que queremos para nuestros mensajes no es necesariamente el mismo JSON que queremos incluir en nuestras plantillas.

+1

Por favor, ¿cómo resolvió este problema? Tal vez me perdí algo. Abrí el siguiente problema en github. [Clave externa poblada con un objeto] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

+2

¿La vieja escuela? ¿De Verdad? – prauchfuss

+0

Smokefoot, RDBMS han existido desde principios de los 70 (al menos). En términos informáticos, eso es bastante "vieja escuela". Sin embargo, ese no es un juicio de valor acerca de su utilidad. Son robustos, sus casos de uso son muy bien entendidos y existe una gran cantidad de tecnología que es compatible con ellos. Desafortunadamente, mucha tecnología REALMENTE NUEVA ha sido desdeñosa acerca de la compatibilidad con bases de datos relacionales diseñadas apropiadamente, y es por eso que confiamos en complementos de terceros como Backbone-relational, y por qué TODAVÍA no está resolviendo nuestros problemas muy bien. – Tess

0

Si desea que el "task_id" en el mensaje JSON a ser la identificación, no la plena JSON para la tarea, a continuación, la "includeInJSON" a ser propiedad ID de la tarea ("task_id")

class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel 
    paramRoot: 'task' 

    relations: [{ 
    type: Backbone.HasMany, 
    key: "messages", 
    relatedModel: "Backbonescaffolddemo.Models.Message", 
    collectionType: "Backbonescaffolddemo.Collections.MessagesCollection", 
    includeInJSON: true 
    reverseRelation: { 
     key: "task_id" 
     includeInJSON: "task_id" 
    } 
    }] 

El valor "verdadero" para includeInJSON dice que use el JSON completo para el modelo relacionado.

Editar: Después de volver a leer su pregunta, no estoy seguro de que mi respuesta se relacione con su problema.

Mi respuesta original es para enviar un mensaje de vuelta al servidor donde desea que el JSON a ser algo así como:

{ 
    "message_title": "My Title", 
    "message_body": "Blah blah blah...", 
    "task_id": 12345 
} 

No estoy seguro de qué es exactamente lo que busca es pasar, pero el camino que se supone que Backbone Relational funciona es que la colección de mensajes de Tarea será una colección de los modelos completos, por lo que puede iterar sobre ellos y pasarlos a vistas para renderizar, etc.

Si desea generar uno de los ID del mensaje en una plantilla o algo así, entonces tomaría el "id" del modelo de mensaje:

myTask.get('messages').first().id -> returns the first message's id 
+1

Por favor, ¿cómo resolvió este problema? Tal vez me perdí algo. Abrí el siguiente problema en github. [Clave externa rellena con un objeto] (https://github.com/PaulUithol/Backbone-relational/issues/158) – antonjs

Cuestiones relacionadas