8

私のモデルの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

aの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 を使用しています。

4

3 に答える 3

0

フォローするかどうかはわかりませんが、シリアライズフィールドを使用すると思います

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Saving+arrays%2C+hashes%2C+and+other+non-mappable+objects+in+text+columns

Rails モデルの変更後にこのフィールドを更新するための before_save コールバック。

class Car
   serialize :serialized_car, Hash
   before_save :generate_json_representation
   def generate_json_representation
      self.serialized_car = ...
   end
   def as_json(options={})
      super(options.merge(methods: [:serialized_car]))
   end
end
于 2013-11-11T22:54:03.793 に答える