Найдите лучший способ работы с Redis-кешем на рельсах - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать Redis для кэширования на рельсах, но у меня возникает проблема при попытке кеширования на нескольких языках.Поскольку мой Redis должен быть кэширован с помощью table_translations

Я пытаюсь с некоторым кодом, но я не думаю, что это лучший способ

У меня есть переменная экземпляра для работы с шаблоном Erb

def index
  @posts = fetch_posts
  @translations = fetch_translations

  puts @posts
  puts @translations
end

и Redis получает вот так

private
  def fetch_posts
    begin
      posts = $redis.get "posts"

      if posts.nil?
        posts = []

        Post.all.order("id ASC").each do |post|
          posts << post
        end

        posts = posts.to_json

        $redis.set "posts", posts
      end

      posts = JSON.load posts
    rescue => error
      puts error.inspect
      posts = Post.all
    end
    posts
  end

  def fetch_translations
    begin
      translations = $redis.get "translations"

      if translations.nil?

        translations = []

        Post.all.order("id ASC").each do |post|
          post.translations.order("locale ASC").each do |translation|
            translations << translation
          end
        end

        translations = translations.to_json

        $redis.set "translations", translations
      end

      translations = JSON.load translations
    rescue => error
      puts error.inspect
      translations = Post.all
    end
    translations
  end

Я делаю это, потому что мне нужно получить версию сообщения на всех языках, поэтому я делаю ключ Redis для перевода

и мой вывод:

{"id":1,"slug":"hello-world","thumb_url":"thumbs/null","thumb_file_name":null,"thumb_content_type":null,"thumb_file_size":null,"thumb_updated_at":null,"featured":false,"hidden":false,"created_at":"2019-04-18T07:05:09.117Z","updated_at":"2019-04-18T07:27:55.830Z"}
{"title":"Xin chao","description":"Day la bai viet dau tien, duoc viet tu rails CMS","body":"xin chao cac ban"}
{"title":"Hello World","description":"This is first post from rails CMS","body":"Hello every body"}

Я нахожу наилучшее решение для преобразования моего вывода в ключ, например:

{"id":1,"slug":"hello-world","thumb_url":"thumbs/null","thumb_file_name":null,"thumb_content_type":null,"thumb_file_size":null,"thumb_updated_at":null,"featured":false,"hidden":false,"created_at":"2019-04-18T07:05:09.117Z","updated_at":"2019-04-18T07:27:55.830Z","title":"Xin chao","description":"Đay la bai viet đau tien, đuoc viet tu rails CMS","body":"xin chao cac ban"}
{"id":1,"slug":"hello-world","thumb_url":"thumbs/null","thumb_file_name":null,"thumb_content_type":null,"thumb_file_size":null,"thumb_updated_at":null,"featured":false,"hidden":false,"created_at":"2019-04-18T07:05:09.117Z","updated_at":"2019-04-18T07:27:55.830Z",title":"Hello World","description":"This is first post from rails CMS","body":"Hello every body"}

Мой код может работать правильно, но мне нужна ваша помощь, чтобысделайте это лучше, пожалуйста, помогите мне улучшить мои навыки

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Я нашел решение, следуя этому материалу Как добавить массив в другой массив в Ruby и не получить многомерный результат?

Концепция сглаживает все атрибутыв два массива, а затем снова хэш это в новый массив

def fetch_posts
  posts = []

  Post.all.order("id ASC").each do |post|
    post.translations.each do |translation|
      posts << [*post.attributes.slice('slug','thumb_url'),*JSON.parse(translation.to_json)].to_h
    end
  end
end

Надеюсь, что эта помощь для всех, кто имеет такой же вопрос ко мне:)

0 голосов
/ 18 апреля 2019

Вы можете использовать встроенный обработчик кэша Rails, поэтому вам не нужно обрабатывать .nil? вызовы ключей кэширования.

  private

  def fetch_posts
    posts = Rails.cache.fetch("posts") do
      begin
        Post.all.order("id ASC").as_json
      rescue => error
        puts error.inspect
        Post.all
      end
    end
    posts
  end

  def fetch_translations
    translations = Rails.cache.fetch("translations") do
      begin
        Post.all.order("id ASC").map do |post|
          post.translations.order("locale ASC").as_json
        end.flatten
      rescue => error
        puts error.inspect
        Post.all
      end
    end
    translations
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...