Ruby On Rails самосохранение в модели

#ruby-on-rails #ruby #model #self

#ruby-on-rails #ruby #Модель #самосохранение

Вопрос:

У меня есть функция в моей модели, которая изменяется следующим образом:

   def compare
        self.dirty = 1 if self.dirty == 0
        compare_recursive(0, MergeDigestTree.all)
        self.dirty = 0;
  end
  

Должен ли я вызывать self.save или это нормально, как это

Ответ №1:

Ваш вопрос открыт для двух интерпретаций:

  • Нужно ли вызывать self.save , чтобы запись была сохранена на этом этапе? да, потому что присвоение атрибута не фиксирует изменение в базе данных.

  • Вы вынуждены вызывать self.save и, таким образом, сохранять запись? нет. Для метода нормально изменять экземпляр и не сохранять его. Я обычно предпочитаю этот, поскольку вы предоставляете больше свободы вызывающему.

В любом случае, документируйте метод соответствующим образом.

Комментарии:

1. Однако область действия self переносится на другие функции. Например, когда я перейду к compare_recursive, будет ли dirty по-прежнему 1

2. другие методы будут видеть грязную версию объекта с новыми значениями для «грязного» (если они не перезагружают экземпляр, чего они не должны делать, если нет веской причины)

Ответ №2:

Да, вам придется сохранить его самостоятельно. Хотя я не понимаю, что на самом деле делает этот метод. 🙂

Комментарии:

1. Пытаюсь быть математичным, когда дело доходит до относительно простых вопросов. 🙂

Ответ №3:

Нет, вам нужно будет вызвать save после внесения изменений, в какой-то момент после этой функции, если не внутри этой функции…

итак, если вы используете эту функцию вручную в своем приложении…

 resource.compare()
resource.save
  

Было бы неплохо, если вы не хотите помещать self.save функцию сравнения.

Комментарии:

1. Что, если compare recursive полагается на dirty, равный 1, поэтому он знает, что сравнивать с самим собой нельзя. Останется ли это так или оно будет действительным только в этой функции

2. он должен оставаться до тех пор, пока он находится в памяти, что будет сроком службы запроса.