Работа с гемом, который позволяет добавить измерение времени (например, start_date и т. Д.) К произвольной модели.
Модуль, реализующий 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, но у него есть сеттер start_date = (val) и геттер start_date (и, конечно, многие другие).
Проблема:
Из-за метода делегата я могу сделать что-то вроде:
entity1 = Entity1.new (Model with acts_as_timeable added)
entity1.start_date => Sat, 28 Jan 2012
, но я не могу сделать
entity1.start_date = Date.today
Я добавил следующий фрагмент кода до модуля ClassMethods к модулю, реализующему Act_as_timeable:
def start_date=(val)
build_timeable_model(:timeable => self) unless timeable_model
timeable_model.start_date=(val) if timeable_model
end
Но это приводит к ActiveRecord :: DangerousAttributeError: start_date = определяется ActiveRecord при попытке инициализации Entity1.new.
1.) Как решить эту проблему?
2.) Существует ли более элегантный способ сделать все открытые методы в Timeable:: База доступна в модели, которая действует без времени, объявляя каждый м вручнуюметод в Timeable :: ActsAsTimeable?