处理允许向任意模型添加时间维度(例如start_date等)的gem。
模块实施ActsAsTimeable:
module Timeable
module ActsAsTimeable
extend ActiveSupport::Concern
module ClassMethods
def acts_as_timeable(options ={})
has_one :timeable_model, :as => :timeable, :class_name => "Timeable::Base", :dependent => :destroy
...
delegate :start_date, :to => :timeable_model, :allow_nil => true
end
end
end
end
ActiveRecord::Base.send :include, Timeable::ActsAsTimeable
我跳过了Timeable :: Base的详细信息,但它有一个setter start_date =(val)和一个getter start_date (当然还有更多)。< / p>
问题:
由于委托方法,我可以做类似的事情:
entity1 = Entity1.new (Model with acts_as_timeable added)
entity1.start_date => Sat, 28 Jan 2012
但我做不到
entity1.start_date = Date.today
我在模块ClassMethods 之前将以下代码段添加到实现acts_as_timeable的模块中:
def start_date=(val)
build_timeable_model(:timeable => self) unless timeable_model
timeable_model.start_date=(val) if timeable_model
end
但是当尝试初始化Entity1.new时,这确实会导致 ActiveRecord :: DangerousAttributeError:start_date =由ActiveRecord定义。
1。)这个问题的解决方案是什么?
2。)是否有一种更优雅的方法可以使Timeable :: Base中的所有公共方法在一个模型中可用,该模型的act_as_timeable无需手动声明Timeable :: ActsAsTimeable中的每个方法?