Когда паруса по умолчанию атрибуты модели получают свои значения? - PullRequest
0 голосов
/ 22 января 2019

Когда паруса заполняют глобальные атрибуты по умолчанию, которые мы добавили на config/models.js, настройки по умолчанию выглядят следующим образом:

attributes: {
  id: { type: 'number', autoIncrement: true },
  createdAt: { type: 'number', autoCreatedAt: true },
  updatedAt: { type: 'number', autoUpdatedAt: true },
}

Теперь, если мы добавим sth, как creatorId к этим атрибутам по умолчанию, как мы должны его заполнитьраз для всех наших models?

attributes: {
  id: { type: 'number', autoIncrement: true },
  createdAt: { type: 'number', autoCreatedAt: true },
  updatedAt: { type: 'number', autoUpdatedAt: true },
  creatorId: { type: 'number'}
}

После этого изменения все модели имеют creatorId со значением 0, как я могу установить userId для всех своих моделей creatorId перед сохранениемне повторяя себя?

1 Ответ

0 голосов
/ 23 января 2019

В контроллере вы создаете запись в базе данных, это должно быть довольно просто. Предположим, у вас есть две модели, User, которая поставляется со встроенной аутентификацией Sails, и Thing, то, что кто-то может владеть.

В модели Thing я бы изменил ownerId на owner и связал бы его с моделью User следующим образом:

attributes: {
    id: { ... },
    createdAt: { ... },
    updatedAt: { ... },
    owner: {
        model: 'User',
        required: yes      // Enable this when all the stuff in the db has this set
    },
}

Это создает связь или отношение один ко многим, если вы знаете терминологию базы данных.

Теперь в контроллере, где вы создаете свой объект для вставки:

Thing.create({
  someAttribute: inputs.someValue,
  someOtherAttribute: inputs.someOtherValue,
  owner: this.req.me.id
});

Если вы хотите использовать созданный объект сразу, добавьте .fetch() к цепочке после .create({...}), например, так:

var thing = await Thing.create({ ... }).fetch();

Дайте мне знать, если что-то неясно.

Я бы порекомендовал вам вложить 9 долларов в покупку курса SailsJS. Это официальный курс, который преподаёт создатель SailsJS Майк Макнил. Вы перейдете от npm i sails -g к производству на облачной платформе Heroku. Он учит основам Vue (аромат парасейла), использованию MailGun, Stripe платежей и многому другому. Они ссылаются на курс на сайте здесь

Обновление

Проделал дальнейшие раскопки и был вдохновлен парой подобных случаев.

Что вы можете сделать, так это расширить свою модель с помощью пользовательского метода, заключающего в себе метод .create(). Этот метод может получить объект запроса от ваших контроллеров, но выполнение этого, а не предыдущего предложения, вероятно, будет более трудоемким, чем просто добавление ownerId: this.req.me.id, к существующим вызовам. Я все равно продемонстрирую.

// Your model
module.exports = {
    attributes: { ... },
    proxyCreate(req, callback) {
        if(!req.body.ownerId){
            req.body.ownerId = req.me.id     // or req.user.id, cant remember 
                                             // which works here
        }
        Thing.create(request.body, callback);
    }
}

А в вашем контроллере:

...
// Change from:
Thing.create(req.body);

// To:
Thing.proxyCreate(req);
...

Обновление № 2

Еще одна идея, которая у меня возникла, - добавить промежуточное ПО для каждого маршрута. Я не знаю сложности ваших маршрутов, но вы можете создать собственное промежуточное ПО только для этих маршрутов.

В router.js вы редактируете свои маршруты (для краткости я покажу один):

....
'POST /api/v1/things/upload-thing': [
        { action: 'helpers/add-userid-to-ownerid' },
        { action: 'new-thing' }
],
....

В helpers/add-userid-to-ownerid:

module.exports: {
    fn: function(req, res) {
        if(!req.body.ownerId){
            req.body.ownerId = req.me.id;
        }
    }
}
...