Поскольку вы используете официальный образ докера PHP, вы можете установить расширение php-redis через PECL:
RUN pecl install redis \
&& docker-php-ext-enable redis
Все просто!
Подробнее о установке расширений PHP можно узнать из официальных документов докера PHP (в случае php-redis
, установки расширений PECL ).
Итак, в вашем случае команда RUN
может выглядеть примерно так:
# Your PHP Dockerfile
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
curl \
libtool \
libxml2-dev \
&& apk add --no-cache \
curl \
git \
mysql-client \
&& pecl install redis \ # install redis extension via PECL
&& docker-php-ext-install \
mbstring \
pdo \
pdo_mysql \
tokenizer \
bcmath \
opcache \
xml \
&& apk del -f .build-deps \
&& docker-php-ext-enable \
pdo_mysql \
redis # don't forget to enable redis extension
Так же, что все говорят о транзакциях.
, Который сказал...
ActiveRecord с направляющих 2.1 отслеживает значения атрибута объекта. Таким образом, если у Вас будет атрибут total
, то Вы будете иметь total_changed?
метод и total_was
метод, который возвращает старое значение.
нет никакой потребности добавить что-либо к Вашей модели для отслеживания это больше.
Обновление: Вот документация для ActiveModel:: Грязный согласно просьбе.
Некоторые другие люди упоминают, что обернули все это в транзакцию, но я думаю, что это сделано для Вас; просто необходимо инициировать откат путем повышения исключения для ошибок в after_* обратных вызовах.
Видят http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
вся цепочка обратного вызова сохранения, сохраняют!, или уничтожьте выполнения вызова в транзакции. Это включает рычаги after_*. Если все идет прекрасное, ФИКСАЦИЯ выполняется, как только цепочка была завершена.
, Если before_* обратный вызов отменяет действие, ОТКАТ выпущен. Можно также инициировать ОТКАТ, повышающий исключение в любом из обратных вызовов, включая рычаги after_*. Обратите внимание, однако, что в этом случае клиент должен знать о нем, потому что обычное сохранение повысит такое исключение вместо того, чтобы бесшумно возвратить false.
ActiveRecord:: Грязный модуль, это встроено в ActiveRecord для отслеживания изменений атрибута. Таким образом, можно использовать thing.amount_was
для получения старого значения.
Добавьте это к своей модели:
def amount=(new_value)
@old_amount = read_attribute(:amount)
write_attribute(:amount,new_value)
end
Тогда использование @old_amount в Вашем коде after_update.
Во-первых, необходимо делать это в транзакции, чтобы гарантировать, что данные записаны вместе.
Для ответа на вопрос Вы могли просто установить членскую переменную на старое значение в before_update, к которому можно тогда получить доступ в after_update, однако это не очень изящное решение.
Идея 1: Оберните обновление в транзакцию базы данных, так, чтобы, если обновление перестало работать, Ваша таблица Totals не была изменена: документы Транзакций ActiveRecord
Идея 2: Спрячьте старое значение в @old_total во время before_update.