Устанавливать динамические значения при генерации методов установки с использованием attr_accessor в ruby
Есть ли лучший способ установить значения для методов установки, когда они сделаны динамически с помощью attr_accessor
метод? Мне нужно это для установки значений для них из другой модели в рельсах. Я пытаюсь сделать что-то вроде ниже.
Model_class.all.each do |mdl|
attr_accessor(mdl.some_field)
end
Тогда я знаю, что он создает набор методов get и setter. То, что я хочу сделать, это когда эти методы создаются, я хочу, чтобы было определено некоторое значение для метода установки. Спасибо заранее.
2 ответа
attr_accessor
не имеет волшебства Для каждого переданного ему параметра он в основном выполняет что-то вроде (код упрощен и не содержит необходимых проверок и т. Д.):
def attr_accessor(*vars)
vars.each do |var|
define_method var { instance_variable_get("@#{var}") }
define_method "#{var}=" { |val| instance_variable_set("@#{var}", val) }
end
end
Тем не менее, attr_accessor :var1, :var2
DSL просто приносит новые 4 старых добрых рубиновых метода. Для того, что вы спрашиваете, можно позаботиться об определении этих методов (или некоторых из них, или ни одного) самостоятельно. Например, для громоздкой настройки с проверками можно сделать:
attr_reader :variable # reader is reader, no magic
def variable=(val) do
raise ArgumentError, "You must be kidding" if val.nil?
@variable = val
end
Вышеуказанное называется как обычно:
instance.variable = 42
#⇒ 42
instance.variable = nil
#⇒ ArgumentError: You must be kidding
Вот еще одна возможная реализация для этого:
def attr_accessor(*args)
args.each do |attribute|
define_method(attribute.to_sym) { eval("@#{attribute}") }
define_method((attribute.to_s + '=').to_sym) {|value| eval("@#{attribute} = value") }
end
end