gpt4 book ai didi

ruby-on-rails - 如何缓存对象的 JSON 表示?

转载 作者:行者123 更新时间:2023-12-04 06:29:21 25 4
gpt4 key购买 nike

JSON我的 Car 的代表模型,我包括一个昂贵的方法的输出:

#car.rb
def as_json(options={})
super(options.merge(methods: [:some_expensive_method]))
end

我有一个标准的索引操作:
#cars_controller.rb
respond_to :json
def index
respond_with(Car.all)
end

我也用 JSON其他地方的汽车表示,如下所示:
#user_feed.rb
def feed_contents
Horse.all + Car.all
end

#user_feeds_controller.rb
respond_to :json
def index
respond_with(UserFeed.feed_contents)
end

因为 JSON car 的表示在多个地方使用,我希望它自己缓存,使用 car.cache_key作为自动过期的缓存键。

这就是我目前的做法:
#car.rb
def as_json(options={})
Rails.cache.fetch("#{cache_key}/as_json") do
super(options.merge(methods: [:some_expensive_method]))
end
end

将缓存代码放入 as_json但不正确,因为缓存不是 as_json 的一部分的责任。这样做的正确方法是什么?我正在使用 Rails 3.2.15。

最佳答案

首先让我说我为这个问题的努力鼓掌。你会发现很难找到比我更对以正确的方式设计软件感兴趣的人——包括用小方法在一个抽象层次上做好一件事——。

但是,我不得不说,在这一点上,我实际上反对问题的前提。我想你的 as_json最好的方式就是这样。

最重要的是将客户端与实现分离。唯一的客户Car#as_json需要知道的是,返回值是一个 Car 的 JSON 表示.和 as_json做那件事并且做得很好。缓存和/或获取是应该保留在方法内部的实现细节,它是该任务不可或缺的细节。

否则就像用 if 说任何方法一样陈述是“不正确的”,因为它做了两件事。当然这不是真的。在这两种情况下(使用 if 和使用 Rails.cache.fetch ),方法实现是一些原子操作,其结果基于条件。

那是可以通过两种方式之一进行的一件事,这与两件事不同。

同时,我不得不不同意@severin 的回应。它当然会起作用,但是您现在已经将您的 View 与实现细节相结合。没有什么,当然不是你的观点,应该对缓存的方法有任何想法,甚至涉及缓存。在我看来,您现在已经泄露了这种方法的抽象。也许这无关紧要,但既然我们在谈论做事的“正确方法”......

所以我说保持现状。但我相信这是一个很好的问题。

关于ruby-on-rails - 如何缓存对象的 JSON 表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com