Доступ к исходному объекту из ColumnSet - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь разделить подобъект в моем наборе записей при импорте данных со свойствами initCB столбца в ColumnSet.

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

const cs = new pgp.helpers.ColumnSet([
  'id',
  { name: 'source_id', prop: 'source', init: function(obj) { return obj.value.id; } },
  { name: 'source_name', prop: 'source', init: function(obj) { return obj.value.name; } },
], { table: 'test_table' });

const data = [
  { id: 1, source: { id: 1, name: 'source1' } },
  { id: 2, source: { id: 1, name: 'source1' } },
  { id: 3, source: { id: 2, name: 'source2' } },
];

const insert = pgp.helpers.insert(data, cs);

Результат:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,'source1','source1'),
  (2,'source1','source1'),
  (3,'source2','source2')

вместо ожидаемого:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,1,'source1'),
  (2,1,'source1'),
  (3,2,'source2')

Похоже, что второй вызов функции обратного вызова для ТОГО ЖЕ исходного поля переопределяет результат предыдущего вызова ДРУГОЙ функции обратного вызова в ЭТОМ исходном поле.

Как я могу избежать этого? Или есть другой способ разделения подобъекта при импорте?

1 Ответ

1 голос
/ 19 июня 2019

Опция prop не совсем так работает.Он предназначен для переназначения value на другое имя свойства, но не предоставляет прямой ссылки на объект.

Вместо этого используйте свойство source дескриптора столбца , чтобыссылка на исходный объект.По иронии судьбы, вы также назвали свойство в своих данных source, что означает, что вам придется использовать source дважды в вашей ссылке:

const cs = new pgp.helpers.ColumnSet([
    'id',
    {name: 'source_id', init: c => c.source.source.id},
    {name: 'source_name', init: c => c.source.source.name}
], {table: 'test_table'});

Первый source - это то, что pg-promise APIподдерживает, в то время как второе имя вашего столбца данных:)

Кроме того, согласно документации , API устанавливает source и this на одно и то же, так что если вы предпочитаете ES5Синтаксис функции (выглядит чище для вашего примера), тогда вы можете сделать это вместо этого:

const cs = new pgp.helpers.ColumnSet([
    'id',
    { name: 'source_id', init: function() {return this.source.id;}},
    { name: 'source_name', init: function() {return this.source.name;}},
], { table: 'test_table' });

Выше мы имеем this точку на объекте данных источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...