У меня есть модель базы данных с несколькими таблицами, которые выглядят так:Использование around_destroy сделать обновление вместо того, чтобы удалить в базе данных в Rails 3
date value_1 value_2 value_3
----------------------------------
-infinity 5 6 7
12-01-2012 4 6 7
15-01-2012 4 7 8
16-01-2012 7 7 8
В приложении данные (в основном), используемые в качестве отдельных значений; отчетливые значения в столбцах имеют важное значение:
date value_1 date value_2 date value_3
------------------ ------------------ ------------------
-infinity 5 -infinity 6 -infinity 7
12-01-2012 4 15-01-2012 7 15-01-2012 8
16-01-2012 7
Эта конструкция приносит некоторые проблемы: я не могу просто «вставить„обновление“и„удалить“какое-то значение для value_2
псевдо-таблицы, так как это может повлиять на значения в других столбцах: если я удалить value_2
для 15.01.2012, удаляя все записи будет изменять как value_2
и value_3
псевдо стол
очевидное решение этой проблемы (для меня) является использование обратных вызовов. чтобы улучшить действия по созданию, обновлению и уничтожению с правильным поведением, используя обратные вызовы around_
.Я создал класс для этих callbac кс:
class TemporalCallbacks
def self.around_destroy(record)
# modify the record: replace it with the values from the previous entry
...
# do an update instead of the destroy
record.save
record.logger.debug "end of destroy callback"
end
def self.around_update(record)
...
end
end
class SomeModel < ActiveRecord::Base
...
around_update TemporalCallbacks
around_destroy TemporalCallbacks
...
end
Используя этот метод, мой контроллер может быть очень чистым, так как бизнес-логика ничего не знает об этой модели базы данных. Мое модели также могут быть чистыми, так как обратные вызовы могут использоваться на нескольких моделях. Контроллер:
class SomeController < ApplicationController
def destroy
@some_model = SomeModel.find(params[:id])
@some_model.destroy
logger.debug "destroyed!"
# respond to the end user
...
end
end
К сожалению, откат транзакции после around_destroy обратного вызова, как показано в журналах:
... some successful sql update queries
end of destroy callback
(0.2ms) ROLLBACK
destroyed!
Я пытался опустошить around_destroy обратного вызова, но это приводит к такое же поведение: срабатывает откат, где-то после обратного вызова around_destroy.
Почему этот откат срабатывает и как я могу это исправить?
Я действительно хочу решить эту проблему с помощью обратных вызовов: это сэкономит много работы, если мне не придется создавать обновление вместо-уничтожить во всех моих моделях/контроллерах. Как я могу это решить?
Спасибо , Я закончил с этим решением. – Scharrels
Добро пожаловать. Было здорово понять это. – tee