Справка по метапрограммированию в Ruby - PullRequest
2 голосов
/ 10 августа 2009

Я понятия не имею, как «метатизировать» этот метод, но я знаю, что он должен быть простым. Метод выглядит так

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

Это для подкласса ActiveRecord. Я хотел бы иметь эти методы для всех полей, которые я указываю. Есть ли способ сделать это в Ruby?

1 Ответ

3 голосов
/ 10 августа 2009
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 в модуль, с помощью которого вы расширяете свои классы.

...