在运行时修改rails模型

时间:2011-04-17 22:11:38

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

关于上一个问题,我正在寻找一种方法 动态地模仿我的模特。

Advice on "Dynamic" Model validation

我工作的解决方案是:

def after_initialize        
  singleton = class << self; self; end

  validations = eval(calendar.cofig)

  validations.each do |val|
    singleton.class_eval(val)
  end
end

在我的实际应用中,我有2个型号

class Calendar < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :calendar

  def after_initialize        
    singleton = class << self; self; end

    validations = eval(calendar.cofig)

    validations.each do |val|
       singleton.class_eval(val)
    end
 end

end

如您所见,应添加到Event类的验证代码位于Calendar字段“config”上。

适用于现有事件,但不适用于新记录。那是因为,在调用after_initialize时,关联还不存在。

除了将配置值放在Event本身之外,我找不到办法。

有任何建议吗?

韩国社交协会!

1 个答案:

答案 0 :(得分:0)

您可能希望在验证阶段运行验证代码,而不是初始化阶段。试试这个:

class Calendar < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :calendar

  validate do |event|
    validations = eval(calendar.cofig)
    validations.each do |val|
      eval(val)
    end
  end
end