在 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
当使用 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