Я играю с Ruby и написал следующий код:
module IdAndNameRedefine
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def use_id_and_name_from_module(use_attribute)
class_eval <<CODE
def id_and_name
"\#{id}-\#{#{use_attribute}.downcase}"
end
CODE
end
end
end
class Model
include IdAndNameRedefine
attr_reader :id, :name1, :name2
def initialize(id, name1, name2)
@id = id
@name1 = name1
@name2 = name2
end
def id_and_name
"#{id}-#{name1}"
end
use_id_and_name_from_module :name2
end
model = Model.new(1, "TesT", "Test number TWO")
puts model.id_and_name
Когда я пытаюсь сделать здесь, это переопределить метод класса id_and_name
в классе Model методом, динамически вставленным модулем IdAndNameRedefine
. Когда этот модуль включен, он создает «статический» метод (на самом деле, метод класса Model.class, как я его понимаю), а когда вызывается use_id_and_name_from_module
, он создает метод класса в модели, который переопределяет id_and_name
для использования любого атрибута модели попросили.
Мой вопрос... Есть ли лучший способ сделать это, или это "правильный" способ сделать это? Я не совсем уверен, нравится ли мне, что class_eval принимает строку, в которой мне нужно экранировать значения и т. д., чтобы это работало.