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

时间:2017-01-31 05:40:21

标签: ruby-on-rails ruby attr-accessor

使用attr_accessor方法动态制作设置方法时,是否有更好的方法设置值?我需要这个来为rails中的另一个模型设置它们的值。我正在尝试做类似下面的事情。

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

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

1 个答案:

答案 0 :(得分: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