私は、さまざまな他のモデルからの計算値ベースのデータである属性を持っています。Rails 3で計算された属性をcounter_cacheと同様にキャッシュできますか?
counter_cache
と同様の値をキャッシュするためのすっきりした方法を探していますが、値がカスタム関数を使用して自動的に更新されるところです。私はすでにモデルにカスタム関数を持っています。
従属データのいずれかが変更されている場合は、この関数を呼び出す必要があります。助言がありますか?コメントをもとに
私は、さまざまな他のモデルからの計算値ベースのデータである属性を持っています。Rails 3で計算された属性をcounter_cacheと同様にキャッシュできますか?
counter_cache
と同様の値をキャッシュするためのすっきりした方法を探していますが、値がカスタム関数を使用して自動的に更新されるところです。私はすでにモデルにカスタム関数を持っています。
従属データのいずれかが変更されている場合は、この関数を呼び出す必要があります。助言がありますか?コメントをもとに
編集、:
[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からユーザーにアクセスするために関連付けを掘り下げる必要がありますが、あまり難しくありません。
ただし、依存関係以外は、一連のレコードに基づいて計算されます。私はcounter_cacheか何かに記録を巻くことによってこれを欺くことができると思う。サイトのすべてのソーシャルデータで収集した好きなものに基づいて人気があるなど、スコアを計算しようとしているとします。彼らが新しい好きなときはいつでも、スコアが上がるはずです。私が必要とするのは、このデータのコレクションに変更がある場合、この特定のオブジェクトに対してこの関数を呼び出すことです。そして、この説明から、保存が適切でない前にも見えます。依存関係は正しくありません。 –
それはかなり良いです。どのように問題を表現しているかは完全に動作します。私は、他の人がこれを読んだ場合に備えて、私が提供すると思ったが、一つの変更を行うつもりです。私は他のユーザーから好きな人が入ってくるので競合状態に陥るかもしれないと思う。人気が更新される前に、最初のようなものが入ってきて、もう1つ目のものが入り、最初のものの前に計算が完了します。スマートプレイは、user.popularity_is_dirty = trueのような処理をしてから、スコアを使用またはレンダリングするまで計算を遅らせることです。 –