1

ユーザーモデルがあるとします。status というインスタンスメソッドがあります。ステータスは関連付けではありません。すでに運用中のデータベースであるため、アクティブなレコード パターンには従いません。

class User < ActiveRecord::Base  

  def status
    Connection.where(machine_user_id: self.id).last
  end    

end

だから私はこれをします。

@users = User.all

まず、status メソッドを熱心にロードできません。

@users.includes(:status).load

第二に、ユーザーの配列内でそのメソッドをキャッシュできません。

Rails.cache.write("user", @users)

ステータス メソッドは、ビュー レイヤーのように見えるまで呼び出されません。

このメソッドをキャッシュする推奨される方法は何ですか。

たぶん、このインスタンス メソッドは私がやりたいことではありません。スコープを見てきましたが、やりたいことのようには見えません。

多分私はただ協会が必要ですか?次に、インクルードを取得し、キャッシュできます。

しかし、関連付けは複雑なロジックを処理できますか。この場合、インスタンス メソッドは単純なクエリです。そのインスタンス メソッドに複雑なロジックがある場合はどうなりますか?

助けてくれてありがとう。

4

1 に答える 1

1

このロジックを、次のような単純な Ruby オブジェクト内にカプセル化しようとしましたか (ただし、非常に大きなセットには使用しません)。

class UserStatuses
  def self.users_and_statuses
    Rails.cache.fetch "users_statuses", :expires_in => 30.minutes do
      User.all.inject({}) {|hsh, u| hsh[u.id] = u.status; hsh }
    end
  end
end

その後、ヘルパーメソッドを使用してキャッシュされたバージョンにアクセスできます

class User < ActiverRecord::Base
  def cached_status
    UserStatuses.users_and_statuses[id]
  end
end

Rails にはキャッシュ ウォーミング アップ技術が組み込まれていませんが、このように抽出することで、Cron で rake タスクを実行することで簡単に実行できます。

また、この場合、関連付けを使用しても問題はありません。Rails 関連付けにより、外部キーや主キーを含むさまざまなオプションを送信できます。

于 2013-10-09T19:45:37.340 に答える