帮助Ruby中的元编程:覆盖Activerecord Setters

时间:2009-08-10 14:41:11

标签: ruby syntax metaprogramming

我不知道如何“元化”这种方法,但我知道它应该很简单。该方法看起来像这样

  def check_sent=(value)
      Date.parse(value) rescue  @dates_bad = true
      self.write_attribute(:check_sent, value)
  end

这适用于ActiveRecord子类。我想为我指定的所有字段使用这些方法。在Ruby中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

class Foo < ActiveRecord::Base
  def self.define_date_setters(*fields)
    fields.each do |field|
      define_method("#{ field }=") do |value|
        Date.parse(value) rescue @dates_bad = true
        self.write_attribute(field, value)
      end
    end
  end

  define_date_setters :check_sent, :other_field, :yet_another_field
end

如果您需要多个课程的该功能,可以将define_setters移动到扩展课程的模块中。