2012-08-17 106 views
0

我是Ruby on Rails的新手(幾天前剛開始使用它)。我正在製作一個簡單的Web前端來顯示各種系統信息,包括S.M.A.R.T信息。我做了這個小類:以正確的方式實現緩存

class SmartValues 
    attr_reader :data 
    KEYS = [:id, :name, :flag, :value, :worst, :thresh, :type, :updated, :failed, :raw] 

    def initialize(devices) 
      @data = Hash[devices.map {|dev| [dev, SmartValues.getValues(dev)]}] 
    end 

    def self.getValues(device) 
      lines = `sudo /usr/sbin/smartctl -A #{device}`.split("\n")[7..-1].collect! { |line| line.split } 
      return lines.map { |line| Hash[KEYS.zip line] } 
    end 
end 

它工作正常,除了它列入我的控制器是這樣的:

class HomeController < ApplicationController 
    def index 
     @smart = SmartValues.new(["/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd", "/dev/sde", "/dev/sdf"]).data 
    end 
end 

所以它必須是在執行smartctl讀取二進制多次爲頁面的每個請求。我想添加某種緩存,以便定期更新信息,但不是每次請求。什麼是正確的RoR方法?

回答

3
def self.lines(device) 
    Rails.cache.fetch("#{device}_lines", :namespace => "smart_values", :expires_in => 15.minutes) do 
    `sudo /usr/sbin/smartctl -A #{device}`.split("\n")[7..-1].collect! { |line| line.split } 
    end 
end 

def self.getValues(device) 
    lines(device).map { |line| Hash[KEYS.zip line] } 
end 
+0

我開始喜歡Rails :) – madprogrammer 2012-08-17 07:29:06

+0

@madprogrammer Ruby和Rails都是美味的工具:) – apneadiving 2012-08-17 07:29:56