Яuбy / Говнокод #19836 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
before_create :build_client_info_attributes
def build_client_info_attributes
  CLIENT_INFO_ATTRIBUTES.each do |attr|
    eval("def #{attr}();return read_attribute(:#{attr}).present? ? read_attribute(:#{attr}) : subject.try(:owner).try(:#{attr});end;")
   end
   eval("def country_id;read_attribute(:country).present? ? read_attribute(:country) : subject.try(:owner).try(:country).try(:id);end;")
end

Шедевр метапрограммирования.

Запостил: maxk maxk, (Updated )

Комментарии (3) RSS

  • PS. А руби правда умеет в аоп из коробки? Или что это?
    Ответить
    • Ну, наверное можно назвать аоп. Вместо обычно сеттера для свойств динамичеси объявляют сеттер с подвывертом. Говно потому что вместо уродливой строки и дырявого eval (что если attr будет "name; drop tables; kill humans; end; name2") есть няшный define_method.
      Ответить
      • Геттеры на самом деле, а не сеттеры.
        Стоит отметить так же, что все это дело генерируется в каллбеке before create, перед созданием объекта в БД. При выборки записи из БД генерация этих методов не происходит. В руби есть стандартная практика, написания статичиских метод, которые генерируют некий код (attr_accessor например), именно ее и нужно было приминить в данном случае
        Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8