2012-11-08 73 views
0

我有3种型号:添加自类模型轨道3

Class Model1 

end 

Class Model2 

end 

Class Model3 

end 

我有这样的代码:

scope :created_between, lambda { |start_time, end_time| where(:created_at => (start_time...end_time)) } 

class << self 
## Class methods for calculating searches 
def created_today 
    today = Time.zone.now 
    created_between(today.beginning_of_day, today.end_of_day) 
end 

def created_yesterday 
    yesterday = Time.zone.now - 1.day 
    created_between(yesterday.beginning_of_day, yesterday.end_of_day) 
end 

def created_last_week 
    start_time = (Time.zone.now - 1.week).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
end 

def created_last_month 
    start_time = (Time.zone.now - 1.month).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
end 

def created_last_year 
    start_time = (Time.zone.now - 1.year).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
end 

我需要这个代码添加到3款,但我不不想在每个模型中重复代码。

我该怎么办?

非常感谢!

+1

我不会为第一种方法使用范围。你可以用另一个带有两个参数的类方法来实现,然后你不需要lamba。 –

+0

谢谢,你能添加一个例子吗? – hyperrjas

+0

只要完成你对其他方法的操作,但是该方法需要两个参数。 –

回答

6

试试这个:

module CommonClassFunctions 

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

module ClassMethods 
    ## Class methods for calculating searches 
    def created_today 
    today = Time.zone.now 
    created_between(today.beginning_of_day, today.end_of_day) 
    end 

    def created_yesterday 
    yesterday = Time.zone.now - 1.day 
    created_between(yesterday.beginning_of_day, yesterday.end_of_day) 
    end 

    def created_last_week 
    start_time = (Time.zone.now - 1.week).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
    end 

    def created_last_month 
    start_time = (Time.zone.now - 1.month).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
    end 

    def created_last_year 
    start_time = (Time.zone.now - 1.year).beginning_of_day 
    end_time = Time.zone.now 
    created_between(start_time, end_time) 
    end 
    end 
end 

Class Model1 
    include CommonClassFunctions 
end 

Class Model2 
    include CommonClassFunctions 
end 

Class Model3 
    include CommonClassFunctions 
end 
+0

非常感谢你完成这个例子。 – hyperrjas

+0

好的答案:),为什么不是'AS :: Concern'?它更简单,并提供更多的功能。我可以编辑使用“ActiveSupport :: Concern”的答案吗? – rewritten

3

您可以使用此方法定义模块,然后将其包含在3个模型中。

像:

module Searcheable 
    def created_today 
    . 
    . 
    . 
    . 
    . 
    end 
end 

然后在类:

class Model1 
    extend Searcheable 
end 

class Model2 
    extend Searcheable 
end 

class Model3 
    extend Searcheable 
end 
+0

谢谢你在我的rails项目的文件夹中创建文件的模块? – hyperrjas

+0

该模块可以放在lib文件夹中。 –

+0

好(可能更好)答案 - 组成通常比继承更好!尽管它仍然依赖于用例... – awenkhh

0

你可以继承做到这一点

class Model 
    class << self 
    def created_today 
     puts "created today from Model" 
    end 
    end 
end 

class Model1 < Model 

end 

class Model2 < Model 

end 

class Model3 < Model 

end 

Model1.created_today 
# output: created today from Model