Оптимизация Rails (с activerecord и помощниками просмотра) - PullRequest
2 голосов
/ 11 ноября 2009

Есть ли способ сделать это в Rails: У меня есть запрос activerecord

@posts = Post.find_by_id(10)

Каждый раз, когда вызывается запрос, SQL генерируется и выполняется в БД, которая выглядит следующим образом

SELECT * FROM 'posts' WHERE id = 10

Это происходит каждый раз, когда выполняется запрос AR. Аналогично с помощью вспомогательного метода, подобного этому

<%= f.textarea :name => 'foo' %> 
#=> <input type='textarea' name='foo' />

Я пишу некоторый код Railsy, ​​который генерирует некоторый текст, который используется какой-то другой системой (база данных, веб-браузер). Мне интересно, есть ли способ написать запрос AR или вызов вспомогательного метода, который генерирует текст в файле . Таким образом, визуализация текста выполняется только один раз (каждый раз, когда изменяется код), а не каждый раз, когда вызывается метод?

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Посмотрите на строку, она может идти к базе данных в первую очередь, но после нее может быть сказано CACHE в начале строки, означая, что она отправляется в кеш запросов ActiveRecord.

Мне также кажется, что вы хотите кэшировать страницу, а не запрос. И даже если бы это был запрос, я не думаю, что это так просто, как find_by_id(10):)

0 голосов
/ 16 ноября 2009

Как Радар и предположил, вам стоит заняться кэшированием в Rails. Вы можете начать с чего-то простого, такого как хранилище памяти или файловый кеш, а затем, если необходимо, перейти к чему-то лучше, например memcached Вы можете добавить некоторое кэширование в вспомогательный метод, который будет кешировать результат после его запроса один раз. Так, например, вы можете сделать:

    id = 10 # id is probably coming in as a param/argument
    cache_key = "Post/#{id}"
    @post = Rails.cache.read(cache_key)
    if @post.nil?
      @post = Post.find_by_id(id)
      # Write back to the cache for the next time
      Rails.cache.write(cache_key,@post)
    end

Единственное, что осталось сделать, - это вставить некоторый код, чтобы завершить запись в кеше, если публикация изменится. Для этого взгляните на использование "Sweepers" в Rails. В качестве альтернативы вы можете посмотреть на некоторые кэширующие гемы, такие как Cache-fu и Cached-model.

0 голосов
/ 11 ноября 2009

Я не уверен, что полностью понимаю ваш вопрос.

Если вы спрашиваете о сгенерированном запросе, вы можете просто сделать find_by_sql и написать свой собственный SQL, если вы не хотите использовать динамические методы активной записи.

Если вы спрашиваете о кэшировании результата в файл, он уже находится в базе данных, я не знаю, что если бы он был в файле, он был бы намного эффективнее.

...