Мне нужно сохранить значение состояния кодирования в видео, пока оно закодировано
У меня есть видеообъект.Во время кодирования видео оно должно блокировать редактирование своих комментариев.
Поэтому видео должно сохранять свое текущее состояние кодирования (происходит ли это да / нет?) И разрешать дочерним комментариям запрашивать это свойство.
Обратите внимание
Я знаю, что есть более эффективные способы решения этой конкретной проблемы.На самом деле мне нужно решить немного иную проблему, однако я чувствовал, что нюансы ее могут спутать с вопросом, поэтому я выбрал эту.Мой вопрос касается именно нюансов переменных isntance, а не того, как лучше решить эту проблему кодирования (которая, очевидно, нуждается в очереди).
class Video
has_many :comments
after_initialize do
@encoding_in_process = false
end
def encode
@encoding_in_process = true
...
@encoding_in_process = false
end
def encoding_in_process?
@encoding_in_process
end
end
class Comment
belongs_to :video
before_update
raise "locked" if video.encoding_in_process?
end
...
end
Как видите, каждый экземпляр видео хранитсяпеременная экземпляра @encoding_in_process
, которая используется для определения возможности обновления комментария.
Проблема
Существует опасность, что в памяти будет несколько экземпляровиз того же видео каждое с разными значениями для @encoding_in_process
.
например
bieber_video = Video.find_all_by_artist('Bieber').last
bieber_video.encode
# assume this takes a while...
bieber_video.encoding_in_process?
# => true
bieber_copy = Video.find_by_id bieber_video.id
bieber_copy.encoding_in_process?
# => false
# Each ActiveRecord objects refer to the same Bieber video
bieber_copy.id == bieber_video.id
# => true
# ...however they refer to different objects in memory:
puts bieber_video
#<Video:0x00000105a9e948>
puts bieber_copy
#<Video:0x00000105a11111>
# and hence each instance has a different version of commenting_locked?
# bieber_video.encoding_in_process? != bieber_copy.encoding_in_process?
Вопрос
Даночто одна и та же строка базы данных может генерировать два разных экземпляра в памяти, каков безопасный способ хранения временной информации, не поддерживаемой базой данных, об этих экземплярах?
EDIT
Фактическая проблема, которую я пытаюсь решить, - это установка флага для объекта при инициализации destroy
, чтобы его дочерние объекты могли определить, могут ли они быть уничтожены сами.
Поэтому это очень мгновенная проблема, и она не подходит для резервного копирования в базу данных.Я использовал этот видео-пример, потому что мне показалось, что он немного яснее, но, возможно, я просто замутил воду.
РЕШЕНИЕ (любезно предоставленный один из ответов ниже
Предложение @Alex D действительно решило проблему, но для большей ясности для тех, кто хочет повторить, действительный код был следующим:
class Video
# set a class variable containing an array of all videos
# which are currently being encoded
@@ids_of_videos_being_encoded = []
...
def encode
store_encoding_state true
begin
encode()
ensure
# make sure we switch this off after
# encoding finishes or fails
store_encoding_state false
end
end
private
def store_encoding_state encoding_in_progress
if encoding_in_progress
@@ids_of_videos_being_encoded.push(id)
else
@@ids_of_videos_being_encoded.delete(id)
end
end
def encoding_initiated?
@@ids_of_videos_being_encoded.include? id
end
end