Как создать новый экземпляр модели вместе с отношениями в redux-orm?

При использовании redux-orm, как можно добавить связанные данные во время создания экземпляра модели?

Например приведены следующие две модели:

// User
import {fk, many, Model} from 'redux-orm';
export default class User extends Model {
    static modelName = 'User';

    static fields = {
        pets: many('Pet', 'pets'),
    };
}

// Pet
import {fk, many, Model} from 'redux-orm';

export default class Pet extends Model {
    static modelName = 'Pet';

    static fields = {
        user: fk('User', 'pets'),
    };
}

Мой редуктор создания в модели питомца выглядит так:

        case 'PET/CREATE':
            const newPet = Pet.create(action.payload);
            newPet.user.add(action.parentId); // parentId is the user id
            break;

Однако это приводит к ошибке, так как newPet.user не определен. Я также пытался withRefs

        case 'PET/CREATE':
            const newPet = Pet.create(action.payload).withRefs;
            newPet.user.add(action.parentId); 
            break;

Я также попытался повторно найти идентификатор:

        case 'PET/CREATE':
            const newPet = Pet.create(action.payload);
            // console.log(newPet.id); // correctly outputs id
            Pet.withId(newPet.id).user.add(action.parentId);
            break;

РЕДАКТИРОВАТЬ

Обнаружил, что я могу сделать

const newPet = Pet.create({ ...action.payload, user: action.parentId });

Но не уверен, что это правильный подход, и если он действительно правильно связывает, поэтому оставим вопрос открытым пока.

1 ответ

Решение

"Вручную", передав значение связанного идентификатора для поля отношения, является одним из способов сделать это. Другой способ - создать первую модель, а затем передать первый экземпляр модели второму экземпляру модели во время или после создания:

const fred = User.create({name : "Fred"});

// Pass during creation
const pet = Pet.create({name : "Spot", user : fred});

// Or after creation
const pet = Pet.create({name : "Spot"});
pet.user = fred;

// Then ask Redux-ORM to apply queued updates and return the updated data
return session.reduce();

редактировать

Обновление: я опубликовал пару постов на Redux-ORM в качестве первых двух частей серии "Практическое Redux", где обсуждаются методы, которые я разработал на основе своего собственного опыта с Redux.

Другие вопросы по тегам