在 ruby 中使用 attr_accessor 生成 setter 方法时设置动态值

Set dynamic values when generating setter methods using attr_accessor in ruby

当使用 attr_accessor 方法动态生成值时,是否有更好的方法为 setter 方法设置值?我需要这个来从 rails 中的另一个模型为它们设置值。我正在尝试执行以下操作。

Model_class.all.each do |mdl|
  attr_accessor(mdl.some_field)
end

然后我知道它创建了一组get和setter方法。我想要做的是,当创建这些方法时,我想提前为 setter method.Thanks 指定一些值。

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 种普通的旧好 ruby 方法。对于您的要求,您可能会注意自己定义这些方法(或其中一些方法,或 none)。例如,对于带有检查的繁琐设置,可以这样做:

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