在关联模型B中使模型A的实例方法可用?

时间:2012-01-28 22:14:59

标签: ruby-on-rails ruby ruby-on-rails-3

处理允许向任意模型添加时间维度(例如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中的每个方法?

0 个答案:

没有答案