18

特定のモデルのすべてのコレクションにメソッドを追加したいと考えています。my_complicated_averaging_methodメソッドを WeatherData コレクションに追加するとします。

WeatherData.all.limit(3).my_complicated_averaging_method()
Station.first.weatherdata.my_complicated_averaging_method()

これを行う最善の方法は何ですか?現時点で私が見つけた唯一の方法は次のようなものです:

class WeatherData < ActiveRecord::Base
  def self.my_complicated_averaging_method
    weighted_average = 0
    @relation.each do |post|
      # do something complicated
      # weighted_average = 
    end
    return weighted_average
  end
end

これはコレクションにメソッドを追加する良い方法ですか? これを行うためのより良い/サポートされている方法はありますか?

4

3 に答える 3

5

where(nil)Rails >= 4 では、代わりに使用できますscoped

class Foo < ActiveRecord::Base  
  def self.bar
    where(nil).pluck(:id)
  end
end

Foo.where(id: [1, 2, 3]).order(:id).bar

さらに、次のように使用できます#scope

class Foo < ActiveRecord::Base
  scope :bar, -> {where(nil).pluck(:id)}
end

最後に、次のようなコードを書くことができますFoo.all.bar

于 2016-11-18T16:38:19.603 に答える
0

物事を機能させるのは良さそうに見えますが、より洗練されたものにするために、もっと良いものがあると確信しています. 確かに、あなたはこれで達成したいことを具体的に説明していませんでした。

「 Observer Classes」を調べることをお勧めします


それらについての記事をここに書きました

オブザーバー クラスは、基本的に特定のモデル関数を監視し、それを拡張します。それらは before_filter などの関数専用だと思いますが、作成した個々の関数を拡張できない理由がわかりません

Railsコアから減価償却されているため、Rails 4.0以降でgemを使用して機能させる必要がありますrails-observers

于 2013-10-12T15:59:57.703 に答える