2011-12-15 3 views
1

私は、さまざまな他のモデルからの計算値ベースのデータである属性を持っています。Rails 3で計算された属性をcounter_cacheと同様にキャッシュできますか?

counter_cacheと同様の値をキャッシュするためのすっきりした方法を探していますが、値がカスタム関数を使用して自動的に更新されるところです。私はすでにモデルにカスタム関数を持っています。

従属データのいずれかが変更されている場合は、この関数を呼び出す必要があります。助言がありますか?コメントをもとに

答えて

2

編集、:

[OK]を、あなたが好きなモデルとUserモデルを持っているので。何が受信した場合、

class User < ActiveRecord::Base 
    has_many :likes 

    def calculate_popularity 
    update_attribute(:popularity, existing_function(foo)) 
    end 
end 

class Like < ActiveRecord::Base 
    belongs_to :user 

    after_create :update_user_popularity 

    def update_user_popularity 
    user.calculate_popularity 
    end 
end 

明らかに:ユーザーのメソッドで人気を更新する機能を入れて、その後、同様にafter_createまたはafter_save(それが作成後に変更することができる場合)コールバックはそれを受け取ったユーザーのためにそれをトリガーします好きなのはさまざまな種類のユーザーアクティビティです。ユーザー自身ではなく、Likeからユーザーにアクセスするために関連付けを掘り下げる必要がありますが、あまり難しくありません。

+0

ただし、依存関係以外は、一連のレコードに基づいて計算されます。私はcounter_cacheか何かに記録を巻くことによってこれを欺くことができると思う。サイトのすべてのソーシャルデータで収集した好きなものに基づいて人気があるなど、スコアを計算しようとしているとします。彼らが新しい好きなときはいつでも、スコアが上がるはずです。私が必要とするのは、このデータのコレクションに変更がある場合、この特定のオブジェクトに対してこの関数を呼び出すことです。そして、この説明から、保存が適切でない前にも見えます。依存関係は正しくありません。 –

+0

それはかなり良いです。どのように問題を表現しているかは完全に動作します。私は、他の人がこれを読んだ場合に備えて、私が提供すると思ったが、一つの変更を行うつもりです。私は他のユーザーから好きな人が入ってくるので競合状態に陥るかもしれないと思う。人気が更新される前に、最初のようなものが入ってきて、もう1つ目のものが入り、最初のものの前に計算が完了します。スマートプレイは、user.popularity_is_dirty = trueのような処理をしてから、スコアを使用またはレンダリングするまで計算を遅らせることです。 –

関連する問題