2012-07-12 10 views
13

¿Alguien ha encontrado una respuesta para las asociaciones polimórficas y los datos de las brasas?Asociaciones polimórficas de datos de ámbar

Necesitaríamos alguna manera de poder consultar el tipo en el otro extremo de la relación de lo que puedo decir.

¿Alguien tiene alguna idea al respecto?

+0

¿Puede dar un ejemplo concreto de lo que quiere hacer? – pangratz

+0

Me gustaría poder tener algo como: JSON: {... "attachedTo": {"user_id": 16} ...} y en la definición del modelo: attachedTo: DS.belongsTo ("auto") –

Respuesta

3

Así que tengo algo. No está terminado, o completamente limpio, pero funciona. Básicamente, utilizo un mixin para eludir completamente las asociaciones de Ember. Estoy seguro de que esto podría incluirse en el adaptador o la tienda, pero por ahora esto funciona.

modelos polimórficos vienen a través de la JSON con un tipoElemento itemId y:

App.Follow = DS.Model.extend 
    user: DS.belongsTo('App.User') 
    itemId: DS.attr("number") 
    itemType: DS.attr("string") 

agrego un mixin a los modelos que están asociadas con ella:

App.Hashtag = DS.Model.extend App.Polymorphicable, 
    follows:(-> 
    name: DS.attr("string") 
    @polymorphicFilter(App.Follow, "Hashtag") 
).property('changeCount') #changeCount gives us something to bind to 

    followers: (-> 
    @get('follows').map((item)->item.get('user')) 
).property('follows') 

El mixin implementa tres métodos, uno que actualiza el changeCount, uno que devuelve el tipo del modelo y el método polymorphicFilter que filtra un modelo por itemType y id:

App.Polymorphicable = Ember.Mixin.create 
    changeCount: 1 

    polymorphicFilter: (model, itemType)-> 
    App.store.filter model, 
     (data) => 
     if data.get('itemId') 
      @get('id') is data.get('itemId').toString() and data.get('itemType') is itemType 

    itemType:()-> 
    @constructor.toString().split('.')[1] 

    updatePolymorphicRelationships:()-> 
    @incrementProperty('changeCount') 

La capa del controlador está protegido de todo esto jankyness, a excepción de tener que llamar updatePolymorphicRelationship para asegurarse de que el fuego fijaciones:

App.HashtagController = Ember.ObjectController.extend 
    follow:()-> 
    App.Follow.createRecord({ 
     user: @get('currentUserController.content') 
     itemId: @get('id') 
     itemType: @get('content').itemType() 
    }) 
    #this provides a way to bind and update. Could be refactored into a didSave() 
    #callback on the polymorphic model. 
    @get('content').updatePolymorphicRelationships() 
    App.store.commit() 

Eso es lo que tengo hasta ahora. Estoy tratando de mantener las cosas en la capa del modelo, ya que está a solo un paso de la capa del adaptador. Si parece que Ember Data no va a mirar a los polimórficos para nada en el futuro, entonces tendría sentido llevar esto a un nivel más alto, pero por ahora, esto funciona y deja mis controladores (relativamente) limpios.

8

Con las últimas brasa de datos construyen ahora se puede utilizar asociaciones polimórficas:

Es necesario configurar sus modelos para que sea polimórfica:

/* polymorphic hasMany */ 
App.User = DS.Model.extend({ 
messages: DS.hasMany(App.Message, {polymorphic: true}) 
}); 

App.Message = DS.Model.extend({ 
    created_at: DS.attr('date'), 
    user: DS.belongsTo(App.User) 
}); 

App.Post = App.Message.extend({ 
    title: DS.attr('string') 
}); 

/* polymorphic belongsTo */ 
App.Comment = App.Message.extend({ 
    body: DS.attr('string'), 
    message: DS.belongsTo(App.Message, {polymorphic: true}) 
}); 

también es necesario configurar alias propiedades en su RESTAdapter

DS.RESTAdapter.configure('App.Post' { 
    alias: 'post' 
}); 
DS.RESTAdapter.configure('App.Comment' { 
    alias: 'comment' 
}); 

El resultado esperado de su servidor debería ser así:

{ 
    user: { 
     id: 3, 
     // For a polymorphic hasMany 
     messages: [ 
      {id: 1, type: "post"}, 
      {id: 1, type: "comment"} 
     ] 
    }, 

    comment: { 
     id: 1, 
     // For a polymorphic belongsTo 
     message_id: 1, 
     message_type: "post" 
    } 
} 

Más información en this github thread

+0

Me he encontrado con un problema cuando un modelo tiene múltiples asociaciones polimórficas (una publicación puede ser comentable, adjuntable y de notificación obligatoria) ¿Ha tenido alguna vez ese problema?En parte, lo he solucionado haciendo que cada uno de mis modelos "polimórficos" se extienda desde el último, pero esto significa que no tengo control sobre qué atributos aparecen en cada modelo. –

+0

Sucede saber la razón por la cual 'hasMany' reemplaza una ID con un objeto' {id: 1, type: 'type'} ', mientras que un belongsTo inyecta esto en el objeto padre? Sería mucho más limpio si fueran iguales, p. 'comment: {id: 1, mensaje: {id: 1, tipo: 'publicar'}}' – Joe

Cuestiones relacionadas