1

こんにちは私はユーザーモデルを持っています

has_many :devices
has_many :events, :through => :devices.

これには次の方法があります。

def get_events_for_devices limit=nil
  events.limit limit
end

次に、ユーザーのデバイスごとに500イベントをキャッシュする必要があるユーザー用のコントローラーがあります。現在、次の通話を使用しています

user_requested = User.find(params[:id])

  profile_info = Rails.cache.fetch("#{user_requested.email}-profile-info") do 
    {:user => user_requested, :devices => user_requested.devices, :events => user_requested.get_events_for_devices(500)}

キャッシュから:userと:devicesを取り戻すことはできますが、:eventsは取り戻すことができません。それらは存在しないようです。

ただし、Rails.cacheを使用せずに、user_requested [:events]を呼び出すだけで、イベントを取得できます。

どのように進めるべきかについてのアイデアはありますか?ありがとう!!

4

1 に答える 1

4

フェッチの仕組みは、特定のキーに関連付けられたデータがない場合、ブロックを実行します。「#{user_requested.email} -profile-info」キーのデータがあるため、ブロックは実行されません。イベントキーがない場合にイベントデータを再計算する場合は、次のような3つの異なるタイプのキーに対して3つの異なるフェッチブロックが必要だと思います。

profile_key = "#{user_requested.email}-profile-info"
user_profile_data = Rails.cache.fetch("#{profile_key}:user") { user_requested }
device_profile_data = Rails.cache.fetch("#{profile_key}:devices") { user_requested.devices }
events_profile_data = Rails.cache.fetch("#{profile_key}:events") { user_requested.get_events_for_devices(500) }
于 2012-07-16T06:46:36.100 に答える