在rails3中,我在模型中制作相同的范围。例如
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
(我没有忘记自动加载库)
如何在活动记录中轻松重用常用范围功能?
我猜这个问题与装载顺序有关。但我没有任何想法要解决。 请提示我。
答案 0 :(得分:8)
我解决了这个调用self.included(class)的范围:
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
答案 1 :(得分:6)
在Rails 3中,声明的范围和返回ActiveRecord::Relation
的类方法之间没有区别,因此使用mixin模块会更优雅:
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