#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. он должен оставаться до тех пор, пока он находится в памяти, что будет сроком службы запроса.