2012-01-23 7 views
1

は、私は、オブジェクトがデータベースから引き出して、呼び出されたときにメソッドをトリガーすることができる何かを必要としています。たとえば、私はAppleクラスがあるとしましょう。のRails 3:特定のオブジェクトをデータベース(モンゴマッパー)から引き出されたときのためにコールバック

#<Apple id: 2, blah, blah, blah> 

が、私はそう、私はアイテムが引かれた回数を追跡することができます(コールバックまたは他の)メソッドを呼び出す方法を必要と返す

Apple.where(:name => "Delicious").first 

:私は、クエリをプリフォームデータベースから。誰もこれを行う方法を提案することはできますか?私はMongoMapperでMongoDBを使用しています。あなたのモデルを想定

答えて

3

オブジェクトがデータベースからロードされた後に呼び出されるコールバックafter_findがあります。だから、:

after_find :update_found_count 

def found_times 
    increment!(:found_count) 
end 
+0

残念ながら、この解決策はMongo Mapperでは動作しません。あなたは私に解決策を教えてくれますか? – Red

+0

いいえ、申し訳ありませんが、私はそれに特有の修正を知らない。この質問を編集して、人々がすでにあなたに無関係な答えを出すのではなく、別の質問をするほうがもっと有益かもしれません。 – Shadwell

2

は、あなたがこのような何かをinitializeをオーバーライドすることができ、access_countという属性を持っています

更新:Shadwell's answerが優れています。あなたのアップフォートをそのように指示してください。その場合は、誰かにとって有用ですので、以下のままにしておきます。

class Apple < ActiveRecord::Base 
    def initialize *args 
    super 

    incr_access_count 
    end 

    private 
    def incr_access_count 
    update_attribute :access_count => access_count + 1 unless new_record? 
    end 
end 

これはかなり素朴ですが、とにかく予測できます。あなたのコントローラーでこれを明示的に行うのはずっと賢明な動きです。データベースからフェッチされるたびにレコードを更新すると、そのレコードに重大な匂いがあります。フェッチされた時間が有用なメトリックになるシナリオを想像するのは難しいです。

+0

そのそれはクエリを強制するので、私は、 'ここ.first'の使用に反論したい素敵なトリック – RameshVel

1

デフォルトファクトリをオーバーライドする新しいファクトリがこれを行う正しい方法です。

例:この場合

class Apple < ActiveRecord::Base 
    # ... 
    def self.delicious 
    # increase count or other complex operations here 
    where(:name => "Delicious").first 
    end 
    # ... 
end 

whereはデフォルトの工場です。これにより

、あなただけApple.deliciousを呼び出すことができるとして成し遂げます。

+0

。しかし、私はそれがこの質問の範囲外だと思う。 – Swanand

関連する問題