2011-08-28 120 views
7

在rails3中,我在模型中做了相同的作用域。例如我可以在Rails中使用普通的ActiveRecord範圍(範圍)和模塊嗎?

class Common < ActiveRecord::Base 
    scope :recent , order('created_at DESC') 
    scope :before_at , lambda{|at| where("created_at < ?" , at) } 
    scope :after_at , lambda{|at| where("created_at > ?" , at) } 
end 

我想將公共範圍拆分爲lib中的模塊。所以我嘗試像這樣。

module ScopeExtension 
    module Timestamps 
    def self.included(base) 
     base.send :extend, ClassMethods 
    end 

    module ClassMethods 
     scope :recent  , lambda{order('created_at DESC')} 
     scope :before_at , lambda{|at| where("created_at < ?" , at) } 
     scope :after_at , lambda{|at| where("created_at > ?" , at) } 
    end 
end 

,我寫這一個

class Common < ActiveRecord::Base 
    include ScopeExtension::Timestamps 
end 

但Rails的顯示這個錯誤。

undefined method `scope' for ScopeExtension::Timestamps::ClassMethods:Module 

(我沒有忘記自動裝載庫)

我怎樣才能輕鬆地重用公共範圍的功能在活動記錄?

我想這個問題涉及加載順序。但我沒有任何想法解決。 請給我提示。

回答

8

我解決了這個呼籲self.included(類)範圍:

module Timestamps 
    def self.included(k) 
     k.scope :created_yesterday, k.where("created_at" => Date.yesterday.beginning_of_day..Date.yesterday.end_of_day) 
     k.scope :updated_yesterday, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
     k.scope :created_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
     k.scope :updated_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
    end 
end 
6

在Rails 3有一個申報的範圍,並且返回一個ActiveRecord::Relation一個類的方法沒有什麼區別,因此它可以更優雅使用混合模塊:

class MyClass < ActiveRecord::Base 
    extend ScopeExtension::Timestamps 
end 

module ScopeExtension 
    module Timestamps 
    def recent 
     order('created_at DESC') 
    end 

    def before_at(at) 
     where('created_at < ?' , at) 
    end 

    def after_at(at) 
     where('created_at > ?' , at) 
    end 
    end 
end 

MyClass.after_at(2.days.ago).before_at(1.hour.ago).recent