Это не всегда необходимо, но у него есть свои возможности. Предположим, мы хотели создать метод копирования на базовом классе Person
. Например:
// define the Person Class
function Person(name) {
this.name = name;
}
Person.prototype.copy = function() {
// return new Person(this.name); // just as bad
return new this.constructor(this.name);
};
// define the Student class
function Student(name) {
Person.call(this, name);
}
// inherit Person
Student.prototype = Object.create(Person.prototype);
Теперь, что происходит, когда мы создаем новый Student
и копируем его?
var student1 = new Student("trinth");
console.log(student1.copy() instanceof Student); // => false
Копия не является экземпляром Student
. Это связано с тем, что (без явных проверок) мы не смогли бы вернуть копию Student
из «базового» класса. Мы можем вернуть только Person
. Однако, если бы мы сбросили конструктор:
// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;
... тогда все работает так, как ожидалось:
var student1 = new Student("trinth");
console.log(student1.copy() instanceof Student); // => true
Самый простой способ проверить, работает ли ваш код - вы можете синхронно обрабатывать его в контроллере после успешного сохранения модели (в действии create
).
Для большинства реальных сценариев, где файлы могут быть большими и требовать времени для обработки - лучший способ - асинхронная обработка в фоновых заданиях, поскольку рельсы имеют среду ActiveJob