2016-10-14 10 views
1

Мои данные выглядит примерно так в RethinkDb:Есть ли лучший способ «объединить» данные с помощью Horizon?

[appointments] 
{ 
    id: 1, 
    date: "2016-01-01", 
    stylistId: 1, 
} 

[stylists] 
{ 
    id: 1, 
    name: "Sue", 
} 

На клиенте, я хочу получать назначение и иметь стилиста, встроенный в объект назначения, как так:

{ 
    id: 1, 
    date: "2016-01-01", 
    stylist: { 
     id: 1, 
     name: "Sue", 
    } 
} 

я могу достичь что-то близко, используя этот запрос:

return this.hz('appointments') 
    .find(appointmentId) 
    .fetch() 
    .toPromise() 
    .then(appointment => { 
    return this.hz('stylists').find(appointment.stylistId) 
     .fetch() 
     .toPromise() 
     .then(stylist => { 
     appointment.stylist = stylist; 
     return appointment; 
     }); 
    }) 
    .then(appointment => this.appointment = appointment); 

Мне интересно, есть ли более чистый способ достижения желаемого результата. Я знаю, что RethinkDb поддерживает поддержку Joins, но похоже, что он не отображается в Horizon. Я также не очень хорошо разбираюсь в RxJS, поэтому мне интересно, может ли соединение быть более чистым.

ответ

2

mergeMap попробовать и map сочетание

const appointmentFind$ = (appointmentId) => hz('appointments').find(appointmentId).fetch(); 
const stylistFind$ = (stylistId) => hz('stylists').find(stylistId).fetch(); 

appointmentFind$(appointmentId) 
    .mergeMap((appointment) => stylistFind$(appointment.stylistId) 
    .map((stylist) => ({ ...appointment, stylist }))) 
    .subscribe((x) => console.log(x)); 

Я записал его здесь, так что это не проверялось, но он должен работать как-то вроде этого