Устанавливать динамические значения при генерации методов установки с использованием 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
Другие вопросы по тегам