Asked Nov 16th, 5:54 AM 62 0 1
  • 62 0 1
0

Cache one model trên Ruby on Rails?

Share
  • 62 0 1

Chào mọi người

Mình có nhiều model: User, Game, Reward, Histories

Giờ mình muốn cache các SQL query cho mỗi model User (chỉ select query) thì mình config như thế nào vậy?

Mình có thử tìm trên Google mà ko có kết quả

Xin cảm ơn!

1 ANSWERS


Answered Nov 16th, 7:04 AM
Accepted
0

Theo mình biết thì Rails mặc định không có kiểu cache chính xác như bạn nói. Tuy vậy Rails có low-level caching mà bạn có thể dùng để cache từng query mà bạn muốn trong khoảng thời gian bạn đặt.

Ví dụ:

class User < ApplicationRecord
  def User.all_cached
    Rails.cache.fetch('users/all', expires_in: 1.day) do
      User.all
    end
  end
end

Sau đó bất cứ chỗ nào bạn cần sử dụng User.all, bạn thay bằng gọi đến User.all_cached. Ngoài ra bất cứ khi nào có thay đổi gì ở bảng users, ví dụ như có người dùng mới đăng ký, người dùng sửa thông tin hay đổi password,... bạn cần phải tự tay invalidate cache ở trên với Rails.cache.delete để dữ liệu được đồng nhất.

Share
daicarun @daicarun
Nov 18th, 6:54 AM

Cảm ơn bạn, mình tự mò được rồi, share lại cho mọi người tham khảo 😄

model: user.rb

def self.find(id)
    user = Rd.user_get(id)
    if !user
      puts "OVERRIDING no user #{id}"
      user = super
      Rd.user_set(id, user, {:ex => 3600})
    end

    return user
  end

services/rd.rb

class Rd
  def self.user_get(id)
    begin
      user = $rd.get("user_info_#{id}")
      puts "user redis #{id}"
      return User.new(JSON.parse(user))
    rescue
      return nil
    end
  end


  def self.user_set(id, user, options={})
    $rd.set("user_info_#{id}", user.to_json, options)
  end
end

$rd là redis client connection chỗ application.rb

$rd = Redis.new(
        :url => "redis://#{ENV['REDIS_CONNECT']}/0",
        :connect_timeout => 0.2,
        :read_timeout    => 1.0,
        :write_timeout   => 0.5
    )
0
| Reply
Share