Как я могу кэшировать вычисляемый столбец в направляющих?

или сделать мой ноутбук сервером >> Я не понимаю, что у вас есть сервер и php, а также сервер mysql?

Как сказал Нираджан, хороший способ сделать это - сохранить путь в БД и сам файл в нужную папку. Затем вы будете использовать поле с указанием пути к отображению вашего изображения:

for $image in $imagesList // *pseudo code*
    <img src="$image->getPath()">
endfor

Быстрый поиск в Интернете поможет вам узнать «реальный код», чтобы сделать это!

14
задан Adam Bellaire 8 October 2008 в 18:09
поделиться

5 ответов

  1. можно наполнить на самом деле кэшируемые значения в кэше направляющих (используйте memcached, если Вы требуете, чтобы он был распределен).

  2. жесткий бит является истечением кэша, но истечение кэша является редким, правильно? В этом случае мы можем просто циклично выполниться по каждому из родительских объектов в свою очередь и убить его кэш, также. Я добавил некоторое волшебство ActiveRecord к Вашему классу для создания получения самой простоты родительских объектов - и Вы не должны даже касаться своей базы данных. Не забудьте звонить Part.sweep_complicated_cache(some_part) как соответствующие в Вашем коде - можно поместить это в обратные вызовы, и т.д., но я не могу добавить его для Вас, потому что я не понимаю, когда complicated_calculation изменяется.

    class Part < ActiveRecord::Base
      has_many :sub_parts, :class_name => "Part"
      belongs_to :parent_part, :class_name => "Part", :foreign_key => :part_id
    
      @@MAX_PART_NESTING = 25 #pick any sanity-saving value
    
      def complicated_calculation (...)
        if cache.contains? [id, :complicated_calculation]
          cache[ [id, :complicated_calculation] ]
        else
          cache[ [id, :complicated_calculation] ] = complicated_calculation_helper (...)
        end
      end
    
      def complicated_calculation_helper
        #your implementation goes here
      end
    
      def Part.sweep_complicated_cache(start_part)
        level = 1  # keep track to prevent infinite loop in event there is a cycle in parts
        current_part = self
    
        cache[ [current_part.id, :complicated_calculation] ].delete
        while ( (level <= 1 < @@MAX_PART_NESTING) && (current_part.parent_part)) {
         current_part = current_part.parent_part)
         cache[ [current_part.id, :complicated_calculation] ].delete
        end
      end
    end
    
7
ответ дан 1 December 2019 в 06:59
поделиться

Я предлагаю использовать обратные вызовы ассоциации.

class Part < ActiveRecord::Base
  has_many :sub_parts,
    :class_name => "Part",
    :after_add => :count_sub_parts,
    :after_remove => :count_sub_parts

  private

  def count_sub_parts
    update_attribute(:sub_part_count, calculate_sub_part_count)
  end

  def calculate_sub_part_count
    # perform the actual calculation here
  end
end

Хороший и легкий =)

28
ответ дан 1 December 2019 в 06:59
поделиться

Я нашел, что иногда существует серьезное основание денормализовать информацию в Вашей базе данных. У меня есть что-то подобное в приложении, что я продолжаю работать, и я просто повторно вычисляю то поле в любое время изменения набора.

Это не использует кэш, и это хранит самое актуальное число в базе данных.

1
ответ дан 1 December 2019 в 06:59
поделиться

Имейте поле, подобное встречному кэшу. Например: order_items_amount и имеют это быть кэшируемым вычисляемым полем.

Использование after_save фильтрует для перевычисления поля на что-либо, что может изменить то значение. (Включая саму запись)

Редактирование: Это в основном, что Вы имеете теперь. Я не знаю ни о каком более чистом решении, если Вы не хотели сохранить кэшируемые вычисляемые поля в другой таблице.

2
ответ дан 1 December 2019 в 06:59
поделиться

Или использование before_save или Наблюдателя ActiveRecord является способом пойти, чтобы удостовериться, что кэшируемое значение актуально. Я использовал бы before_save и затем проверил бы, чтобы видеть, используете ли значение Вы в вычислении, на самом деле измененном. Тем путем Вы не должны обновлять кэш, если Вы не должны.
Хранение значения в дб позволит Вам кэшировать вычисления по нескольким запросам. Другая опция для этого состоит в том, чтобы сохранить значение в кэш-памяти. Можно сделать специальное средство доступа и метод set для того значения, которое может проверить кэш-память и обновить ее в случае необходимости.
Другая мысль: будут случаи, где Вы будете изменять значение в одной из моделей и нуждаться в вычислении, которое будет обновлено, прежде чем Вы сделаете сохранение? В этом случае Вам будет нужно к грязному значение кэша каждый раз, когда Вы обновляете любую из расчетных величин в модели, не с before_save.

2
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

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