2009-07-08 5 views
2

私は初めてのレールプラグインを書いています。非常に単純化された方法で、開発者がレーキタスクを通じることができる値を指定できるようにしたいと思います。私はこのような何かを考えています... RailsのActiveRecordプラグインを書く

class User < ActiveRecord::Base 
    monitor "Users", count 
    monitor "Active Users", count("activated_at != NULL") 
end 
  1. 私はモニターがActiveRecordの::基本のクラスメソッドであることが必要と思いますが、どのように/どこで私のプラグインでそれを指定するのですか?
  2. monitor関数の引数は値ではなく、実行するコードのブロックである必要があります。私はこれを指定して構文を単純にする最良の方法についてはあまりよく分かりません。おそらくそれはmonitor "Active Users", {count "activated_at != NULL"}でなければならないでしょうか?
  3. 開発者がUser.count、つまりcountを指定する必要がない、つまりクラスを自動的に選択する(そして、ブロックはインスタンスではなくクラスで呼び出される)場合は、これが不可能な場合は、モニタのステートメントをモデルに入れる理由はないと思います(#5を参照)。
  4. これらの値の実際のカウント(ブロックの実行)は、オフラインのレーキタスクによって行われます。 monitor関数は、これらのブロックをレーキタスクで使用できるようにするために何を行う必要がありますか?それらをクラス変数に格納しますか?
  5. おそらく、モニタステートメントをモデルでまったく指定する必要はありません。多分それはそれを混乱させるので、私はそれらを置くために任意の代替場所を歓迎するでしょう。

私は現時点で自分のアイデアをスケッチして、Rubyで/できないことを理解しようとしています。どんな助けもありがたい。

更新:私はプラグインの目的をより明確にしようとします。私は開発者がレーキタスクによって監視されるべきメトリクスを定義できるようにしたい。レーキタスクは、これらのメトリックを繰り返し、ファイルに値を書き込みます(これを少し簡略化しました)。 rakeタスクは、rake monitors:update(必須すなわち、なしのparams)のようなものは非常にシンプルになります

答えて

0

私はあなたの助けてくれてありがとう、しかし、私は別のアプローチ(以下に抜粋)に行きました。

モデルで属性を指定する代わりに、私はいつでもgemで見られるアプローチを使用しました。

dashboard "Users", User.count 
dashboard "Activated Users", User.count('activated_at') 

私のlibには2つの機能で構成されています:

def self.dashboard(name, attribute) 
     puts "** dailydashboard: #{name} = #{attribute.to_s}" 
    end 

    def self.update(file) 
    eval File.read(file) 
    end 

は基本的に、私のrakeタスクが updateを呼び出し、 dashboard.rbeval uatesをロードし、私は私のconfigディレクトリ内のRubyファイル "dashboard.rb" を配置しましたアル家の周りに行くため

** dailydashboard: Users = 2 
** dailydashboard: Activated Users = 1 

申し訳ありません:それは繰り返しが、これを出力dashboard機能を呼び出しますittle bit。バックグラウンド/オフラインの場合、これは非常に単純なアプローチのように思えます。あなたの助けをありがとう!

0

rakeタスクのためのデザインは次のように見ていただきましたnamed_scope

ためのコードを見てみ?

rake monitor:user:active_users?

OT:

activated_at is not nullはあなたが

はなぜモニターを定義し忘れていない、とだけnamed_scopesを使用し、考えてみればたいSQLのですか? select *を返す代わりに、select count(*)

+0

ありがとうございます、あなたはSQLについて正しいです - それは単なる例でした。私はnamed_scopesが非常に便利だと思うが、それは私の問題をかなり解決していない。私は、プラグインが達成しようとしていることに関するより多くの情報で質問を更新しました。 – ideasasylum

1

あなたはたぶん間違った場所にレイクタスクの定義を入れています。モデルには、その消費者にとって有効なロジックだけが含まれていて、レーキのような特定のアプリケーションには関係しません。

モデルに名前付きスコープをいくつか定義し、レーキタスクで使用可能なアクションを指定する方がよい場合があります。名前付きスコープは、アプリケーションの他の領域で簡単に再利用できます。(例えばを

class User < ActiveRecord::Base 
    named_scope :active_users, :conditions => "activated_at != NULL" 
end 

そして、あなたはすくいファイル内で使用することができ、非常に単純なDSLを作成します: - モデルは次のようになります(あなたの部分に不要な作業これはRailsの機能であることに注意してください)ありlib/tasks/count.rake)。あなたがたとえば、これを行うことができます何か:

require "your-plugin" 
namespace :count do 
    # Make your plugin rewrite this internally to User.count 
    YourPlugin::CountTask.new :users 

    # Make your plugin rewrite this to User.active_users.count 
    YourPlugin::CountTask.new :users, :active_users 

    # Perhaps allow usage of blocks as well? 
    YourPlugin::CountTask.new :users, :complicated do 
    User.count(complex_conditions) 
    end 
end 

これは、その後count:userscount:users:active_userscount:users:complicatedという名前のタスクをユーザに提供する必要があります。このような

+0

私は自分自身でポイントを取って、Omarはnamed_scopesについて作った。間違いなく便利です。私はより多くの情報で質問を更新しました。私は今度はもっと意味をなさないことを願っています。 – ideasasylum

0

何かが欲しいものを行う必要があります。

module Monitored 
    @@monitors = [] 
    def self.monitor(name, method) 
    @@monitors.push [name, method] 
    end 
    def self.run_monitor(name) 
    send @@monitors.select{|m| m[0] == name}[0][1] 
    end 
end 

がテストされていないが、あなたのアイデアを得る、私は願っています。

関連する問題