如何初始化'attr_accessor'属性值?

Bac*_*cko 9 ruby attributes initialization ruby-on-rails ruby-on-rails-3

可能重复:
attr_accessor默认值

我正在使用Ruby on Rails 3.0.9,我想attr_accessor在我继承的类\ model中初始化一些属性值ActiveRecord::Base.那是,

...在我的模块中我有:

class User < ActiveRecord::Base
  attr_accessor :attribute_name1,
                :attribute_name2,
                :attribute_name3,
                ...
end
Run Code Online (Sandbox Code Playgroud)

并且我想设置true的所有attr_accessor属性值.我怎样才能做到这一点?

PS:当然我想解决上述问题,接近"Ruby on Rails Way".我知道after_initialize回调但是通过使用该方法,我应该重复每个attribute_name<N>语句,我想将值设置true在该after_initialize语句中(...这不是 DRY - 不要重复自己).也许有更好的方法来实现这一目标.当您声明这些属性时,有没有办法attr_accessor"动态" 设置属性值?也就是说,我希望立即声明和设置attr_accessor属性!

apn*_*ing 12

你试过了吗:

class User < ActiveRecord::Base
  attr_accessor :attribute_name1,
                :attribute_name2,
                :attribute_name3,
                ...

  after_initialize :set_attr

  def set_attr
    @attribute_name1 = true
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 7

对于Rails 3.2或更早版本,您可以使用attr_accessor_with_default:

class User < ActiveRecord::Base
  attr_accessor_with_default :attribute_name1, true
  attr_accessor_with_default :attribute_name2, true
  attr_accessor_with_default :attribute_name3, true
  ...
end
Run Code Online (Sandbox Code Playgroud)

由于您的默认值是不可变类型(布尔值),因此此方法的这种形式在此处可以安全使用.但是如果默认值是可变对象(包括数组或字符串),请不要使用它,因为所有新模型对象将共享完全相同的实例,这可能不是您想要的.

相反,attr_accessor_with_default它将接受一个块,每次都可以返回一个新实例:

attr_accessor_with_default(:attribute_name) { FizzBuzz.new }
Run Code Online (Sandbox Code Playgroud)

  • 请注意当前读者从Rails 3.2开始不推荐使用`attr_accessor_with_default` (5认同)