Используя ActiveRecord, там способ получить старые значения записи во время after_update

Поскольку вы используете официальный образ докера 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

74
задан henrebotha 5 August 2015 в 08:51
поделиться

6 ответов

Так же, что все говорят о транзакциях.

, Который сказал...

ActiveRecord с направляющих 2.1 отслеживает значения атрибута объекта. Таким образом, если у Вас будет атрибут total, то Вы будете иметь total_changed? метод и total_was метод, который возвращает старое значение.

нет никакой потребности добавить что-либо к Вашей модели для отслеживания это больше.

Обновление: Вот документация для ActiveModel:: Грязный согласно просьбе.

143
ответ дан user664833 24 November 2019 в 11:54
поделиться

Некоторые другие люди упоминают, что обернули все это в транзакцию, но я думаю, что это сделано для Вас; просто необходимо инициировать откат путем повышения исключения для ошибок в after_* обратных вызовах.

Видят http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

вся цепочка обратного вызова сохранения, сохраняют!, или уничтожьте выполнения вызова в транзакции. Это включает рычаги after_*. Если все идет прекрасное, ФИКСАЦИЯ выполняется, как только цепочка была завершена.

, Если before_* обратный вызов отменяет действие, ОТКАТ выпущен. Можно также инициировать ОТКАТ, повышающий исключение в любом из обратных вызовов, включая рычаги after_*. Обратите внимание, однако, что в этом случае клиент должен знать о нем, потому что обычное сохранение повысит такое исключение вместо того, чтобы бесшумно возвратить false.

9
ответ дан Gabe Hollombe 24 November 2019 в 11:54
поделиться

ActiveRecord:: Грязный модуль, это встроено в ActiveRecord для отслеживания изменений атрибута. Таким образом, можно использовать thing.amount_was для получения старого значения.

4
ответ дан John Topley 24 November 2019 в 11:54
поделиться

Добавьте это к своей модели:

def amount=(new_value)
    @old_amount = read_attribute(:amount)
    write_attribute(:amount,new_value)
end

Тогда использование @old_amount в Вашем коде after_update.

3
ответ дан Daniel Von Fange 24 November 2019 в 11:54
поделиться

Во-первых, необходимо делать это в транзакции, чтобы гарантировать, что данные записаны вместе.

Для ответа на вопрос Вы могли просто установить членскую переменную на старое значение в before_update, к которому можно тогда получить доступ в after_update, однако это не очень изящное решение.

0
ответ дан jonnii 24 November 2019 в 11:54
поделиться

Идея 1: Оберните обновление в транзакцию базы данных, так, чтобы, если обновление перестало работать, Ваша таблица Totals не была изменена: документы Транзакций ActiveRecord

Идея 2: Спрячьте старое значение в @old_total во время before_update.

0
ответ дан bradheintz 24 November 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: