2017-12-05 4 views
1

私は何かを行うために日付範囲を使用する多くのスコープを持っています。 clicks_between(開始日、終了日)。私はまた、学校の年の文字列の追加をサポートしたいと思っています。ここには、開始メソッドと終了メソッドを持つ既存のSchoolYearがあります。ActiveRecordスコープを動的に追加する

私のような何かを行うことができます:しかし、私はむしろ、どこでも、このコードをコピー&ペーストする必要はないと思います

scope :clicks_during, -> (year) { 
    year = Year.new(year) if year.is_a?(Integer) 
    send('clicks_between', year.start, year.end) 
} 

を。 "betweeen"スコープが既に存在する場合、このスコープを動的に追加する方法はありますか?

+0

私は、あなたが探していると思います懸念https://stackoverflow.com/questions/14541823/how-to-use-concerns-in-rails-4 –

答えて

2

懸念の概念を適用すると、モジュール内の依存スコープをグループ化し、必要に応じてそのモジュールをモデルに含めることができます。さらに、スコープが引数を受け入れる場合は、スコープの代わりにクラスメソッドを使用することをお勧めします。詳しくは、お使いのモデルではPassing in arguments.

module Clickable 
    extend ActiveSupport::Concern 

    class_methods do 
    def clicks_between(start_date, end_date) 
     # ... 
    end 

    def clicks_during(year) 
     year = Year.new(year) if year.is_a?(Integer) 
     send('clicks_between', year.start, year.end) 
    end 
    end 
end 

を確認してください。

class SomeModel < ActiveRecord::Base 
    include Clickable 
end 

class OtherModel < ActiveRecord::Base 
    has_many :some_models 
end 

は今、あなたはいつものようにスコープを呼び出すことができます。

SomeModel.clicks_during(2017) 
other_model.some_models.clicks_during(2017) 

ActiveSupport::Concern api

関連する問題