在`Class`对象中缓存变量

时间:2015-09-28 21:42:50

标签: ruby

我进行了API调用:

def set_youtube(user)
  Youtube.get_subscribers(user)
  Youtube.get_views(user)
end

这是我的服务对象:

class Youtube
  class << self
    def get_hash(user)
      ## code to return a youtube JSON hash containing subscribers and views
    end

    def get_subscribers(user)
      youtube_hash = Youtube.get_hash(user)
      ## code to return a subscriber count
    end

    def get_views(user)
      youtube_hash = Youtube.get_hash(user)
      ## code to return a view count
    end
  end
end

但是,我发现直接在用户上调用该方法更为优雅。我不想两次调用API来获取订阅者然后获取视图。但我也不想这样做:

youtube_hash = Youtube.get_hash(user)
Youtube.get_subscribers(youtube_hash)
Youtube.get_views(youtube_hash)

我想暂时将变量缓存在此对象的实例中,以便我可以将它用于两个类方法。处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

你可以使用类变量(前缀为@@符号)并缓存哈希值,但是你必须保持它并且它可能会变得混乱,而我建议使用更多的OO方法?

您可以将其设为&#34; Youtube&#34;的实例,并缓存哈希值

class Youtube
  def initialize(user)
    @user = user
  end

  def hash
    @hash ||= ... #the logic used to get the user hash in your get_hash using the @user instance variable
  end

  def subscribers
    @subscribers ||= ... #the logic used to get the user subscribers in your get_subscribers however using the hash getter method which in turn uses the @hash instance variable
  end

  def views
    @views ||= ... #the logic used to get the user views in your get_views  however using the hash getter method which in turn uses the @hash instance variable
  end
end

然后你可以执行以下操作,它将使用缓存的哈希:

yt = Youtube.new(user: user)
yt.views
yt.subscribers

也许&#34; YoutubeUser&#34;是一个更好的名字?只是一个建议。这一切也可以移动到User模型,只使用Youtube服务对象。例如:

class User
  before_create :set_youtube

  def set_youtube
    youtube = Youtube.new(self)
    self.youtube_subscribers = youtube.subscribers
    self.youtube_views = youtube.views
  end
end

我认为set_youtube是一个实例方法,因此无需传递用户,但类方法也是类似的。