2015-05-20 3 views
0

У меня есть определенные ключи, такие как createdAt и updatedAt, которые должны быть определены во всех схемах. Есть ли способ избежать дублирования кода?Применить определенные ключи для всех ключей SimpleSchemas

Я использую пакет SimpleSchema.

мне нужен следующий код во всех моих Schemas.xxx

createdAt: { 
    type: Date, 
    optional: true, 
    autoValue: function() { 
     if (this.isInsert) { 
      return new Date; 
     } else if (this.isUpsert) { 
      return {$setOnInsert: new Date}; 
     } else { 
      this.unset(); 
     } 
    }, 
    autoform: { 
     type: 'hidden' 
    } 
}, 
updatedAt: { 
    type: Date, 
    optional: true, 
    autoValue: function() { 
     if (this.isUpdate) { 
      return new Date(); 
     } 
    }, 
    autoform: { 
     type: 'hidden' 
    } 
} 

ответ

1

Создайте подсхему &, затем включите ее в каждую коллекцию, обратите внимание, что конструктор SimpleSchema теперь принимает массив.

Schema._Basic = new SimpleSchema({ 
    userId: { 
    type: String, 
    optional: true 
    }, 
    createdAt: { 
    type: Date, 
    label: 'Created at' 
    }, 
    updatedAt: { 
    type: Date, 
    label: 'Updated at', 
    optional: true 
    }, 
    } 
}); 

Schema.Client = new SimpleSchema([Schema._Basic, 
    { 
    address: { 
     type: String 
     optional: true 
    } 
    } 
]); 
+0

Это похоже на приятное решение для меня. Любые плюсы и минусы для использования этого решения с использованием сборных крючков? – Chris

+0

Сделайте оба! Создайте поле в своей схеме и вставьте с помощью крючков коллекции. На самом деле неважно, попадают ли данные вручную, через autoValue или hook. Лично я иду вручную. autoValues ​​может быть ошибочным, и есть некоторые случаи (такие как preference booleans), где я не хочу запускать изменение в updatedAt. –

1

Я хотел бы сделать это с помощью этого очень хороший пакет: matb33:collection-hooks Это добавит до и после того, как крючки для ваших коллекций. Таким образом, вы можете добавить поля createdAt и updatedAt следующим образом:

Для CollectionName.insert();

CollectionName.before.insert(function (userId, doc) { 
    var currentDate = new Date(); 
    doc.createdAt = currentDate; 
    doc.updatedAt = currentDate; // could be also null if you want 
}); 

То, что в приведенном выше режиме запускается всегда непосредственно перед вставкой вставки. И это для CollectionName.update();

CollectionName.before.update(function (userId, doc) { 
    doc.updatedAt = new Date(); 
}); 

Это срабатывает при каждом обновлении коллекции.

+0

Может ли это быть более общим для всех коллекций? – Chris

+1

Хорошо работает с CollectionHooks.defaults.before.all. – Chris

+0

А, хорошо знать, что это работает так же :) – lehtu

Смежные вопросы