Есть ли лучший способ объединить данные с помощью Horizon?

Мои данные в RethinkDb выглядят примерно так:

[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 поддерживает объединение, но не похоже, что он представлен в Horizon. Я также не очень хорошо разбираюсь в RxJS, поэтому мне интересно, можно ли там выполнить соединение более аккуратно.


person Josh Graham    schedule 14.10.2016    source источник


Ответы (1)


попробуйте комбинацию 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));

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

person jirikolarik    schedule 14.10.2016