1. Ruby / Говнокод #19836

    −55

    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, 18 Апреля 2016

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

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

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