2011-08-25 5 views
13

estoy usando Backbone.jsBackbone.js - Manejo relaciones de modelos de una manera REST

Por ejemplo, supongamos que tenemos un modelo de "productos" y un modelo "categorías", que tienen una relación muchos-a- muchas relaciones. En uno de mis puntos de vista, digamos que necesito recuperar una lista de todas las categorías y saber si cada una está relacionada con el modelo de producto actual.

¿Configuro una colección de "categoría" y la hago ser una propiedad de mi modelo y de alguna manera le doy acceso a la identificación del modelo para que cuando se busque, solo consiga las categorías que están relacionadas? ¿Y luego podría buscar todas las categorías e interrogarlas para ver cuáles están relacionadas mientras todavía tengo las que no lo están?

No tengo idea de cuál sería la mejor manera de hacerlo. Estoy acostumbrado a usar un ORM que lo hace fácil en el lado del servidor.

Respuesta

13
+1

I ditto backbone-relational. Es una pena que no sea parte del desarrollo principal de Backbone. –

0

Suponiendo que usted está utilizando una tabla de unión en el backend:

crear una colección y el modelo que contiene todas las filas en la tabla de unión y añadir los siguientes métodos para la colección: productsByCategory y categoriesByProduct (usando [unen colección] .donde (...).)

Tener datos en backbone reflejando sus datos en el backend parece ayudar a mantener las cosas simples y no tendrá que hacer nada complicado al configurar las direcciones URL.

5

Hay una solución personalizable & simple para él, aunque puede no ser tan robusta como backbone-relational.

Backbone.ModelWithRelationship = Backbone.Model.extend({ 
    mappings: {}, 

    set: function(attributes, options) { 
    _.each(this.mappings, function(constructor, key) { 
     var RelationshipClass = stringToFunction(constructor); 
      var model = new RelationshipClass(); 

     /* New relational model */ 
      if (!this.attributes[key]) { 
     this.attributes[key] = (model instanceof Backbone.Collection) ? model : null; 
      } 

      /* Update relational model */ 
      if (attributes[key] && !(attributes[key] instanceof Backbone.Model || attributes[key] instanceof Backbone.Collection)) { 
     if (model instanceof Backbone.Model) { 
      this.attributes[key] = model; 
      this.attributes[key].set(attributes[key], options);   
     } else if (model instanceof Backbone.Collection) { 
      this.attributes[key].reset(attributes[key], options);   
     } 

     delete attributes[key]; 
      } 
    }, this); 

    return Backbone.Model.prototype.set.call(this, attributes, options); 
    } 
}); 

Se puede declarar el mapeo simplemente mediante la creación de una subclase de Backbone.ModelWithRelationship.

Models.Post = Backbone.ModelWithRelationship.extend({ 
    mappings: { 
    'comments': 'Collection.CommentCollection', 
    'user': 'Models.User' 
    } 
}); 
1

http://pathable.github.com/supermodel/ es fantástico. Te permite hacer cosas como:

Post.has().many('comments', { 
    collection: Comments, 
    inverse: 'post' 
}); 

Comment.has().one('post', { 
    model: Post, 
    inverse: 'comments' 
}); 

var post = Post.create({ 
    id: 1, 
    comments: [{id: 2}, {id: 3}, {id: 4}] 
}); 

post.comments().length; // 3 
var comment = Comment.create({id: 5, post_id: 1}); 
post.comments().length; // 4 
comment.post() === post; // true :D 
+0

Estoy descubriendo que la supermodelo es mucho más simple y directa que la columna vertebral-relacional. Tiene un diseño inteligente que mantiene almacenadas cada instancia de un modelo en su propia colección como un punto central de almacenamiento que se mantiene fresco. –

Cuestiones relacionadas