3

複数のカウンター キャッシュを持つ db スキーマがあります。カウンター キャッシュを多数のテーブルに分散させるのではなく、さまざまなカウンター キャッシュをすべて含む user_counters というテーブルを作成したいと考えています。次のようなメソッドを使用して、サービス オブジェクトからこれらのキャッシュを更新します。

def update_user_counter(column, user_id)
  UserCounter.increment_counter(column, user_id)
end

ただし、関連付けられたユーザーの UserCounter レコードは、ユーザーと同じ ID を持たない可能性が高くなります。私がやりたいことは次のようなものです:

def update_user_counter(column, user_id)    
  UserCounter.increment_counter(column, UserCounter.where('user_id = "#{user_id}"')
end

どうすればこれを達成できるかについて何か考えはありますか? ありがとう!!

4

1 に答える 1

2

これらがユーザーに関連付けられた 10 個の属性である場合、それらを単純にユーザー モデルの一部にしない理由はありますか? その場合でも、以下のコードは機能します (UserCounter の代わりに User のメソッド部分を作成するだけです)。

独自の方法で実装したい場合は、最初に、user_countersテーブルに user_id のインデックスがあることを確認してください (Rails はインデックスと FK の追加について馬鹿げているため)。

次に、これを行うことができます(「列」をシンボルとして渡します):

class UserCounter < ActiveRecord::Base
  #other code

  def self.update_user_counter(column, user_id)
    counter = UserCounter.find_by_user_id(user_id)
    counter.update_attribute(column, counter.read_attribute(column) + 1)
    counter.save!
  end
end

そして、あなたの他のモデルでは:

class SomeOtherModel < ActiveRecord::Base
  #Model code

  def update_counter(user)
    UserCounter.update_user_counter(:this_column, user.id)
  end
end

このソリューション (または update_counter メソッドを使用) はどちらも、ルックアップ用と更新用の 2 つのデータベース ヒットを必要とします。速度が必要な場合は、これを SQL で直接記述できます。

query = "UPDATE user_counters SET #{column} = #{column} + 1 WHERE user_id = #{user_id};"
ActiveRecord::Base.connection.execute(query);

user_idこれは、が で一意であると想定していuser_countersます。

于 2013-05-08T07:06:09.247 に答える