1

この拡張機能cache_findは、アプリのすべてのモデルのメソッドを作成します (この投稿を使用して作成しました)。

config/active_record_extension.rb

require 'active_support/concern'

module ActiveRecordExtension

  extend ActiveSupport::Concern

  # add your instance methods here
  def flush_find
    Rails.cache.delete([self.class.name, :cached_find, id])
  end

  included do
    after_commit :flush_find
  end

  module ClassMethods
    def cached_find id
      Rails.cache.fetch([self.name, :cached_find, id]) { self.find(id) }
    end
  end
end

# include the extension
ActiveRecord::Base.send(:include, ActiveRecordExtension)

このコードを宝石に変えて、このレポに追加しました。

したがって、このメソッドを次のように動的に追加したいと思います。

class User << ActiveRecord::Base
  # id, name, email, age...

  cached :find, :find_by_name, :find_by_email
end

上記のコードはcached_find, flush_find, cached_find_by_name, flush_find_by_name... を生成するはずです。

私は助けが必要です:

  1. gemRails.cacheでメソッドをテストします。model_caching
  2. cachedメソッドの引数に基づいてアプリ モデルにメソッドを動的に追加するコードを作成します。

私を助けたが、すべてを満たしていないいくつかのリンク:

https://github.com/radar/guides/blob/master/extending-active-record.md

http://railscasts.com/episodes/245-new-gem-with-bundler

http://guides.rubyonrails.org/plugins.html

gem コードを自由に複製して改善してください。

4

2 に答える 2

3

ActiveRecord::Base をハックする必要はありません。次のように、Marc-Alexandre が言ったことを懸念事項に追加できます。

module ActiveRecordExtension
  extend ActiveSupport::Concern

  ...

  module ClassMethods
    def cached(*args)
      define_method "cached_#{arg.to_s}" do 
        # do whatever you want to do inside cached_xx
      end

      define_method "flush_#{arg.to_s}" do
        # do whatever you want to to inside flush_xx
      end
    end
  end
end

また、拡張機能を ActiveRecord に直接自動的に含めることはしません。使用するモデルに明示的に含める方がよいと思います。

于 2013-08-20T10:28:18.560 に答える