我进行了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)
我想暂时将变量缓存在此对象的实例中,以便我可以将它用于两个类方法。处理这个问题的正确方法是什么?
答案 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
是一个实例方法,因此无需传递用户,但类方法也是类似的。