冻结DataMapper Model中的属性

时间:2012-12-12 07:03:41

标签: ruby datamapper ruby-datamapper

考虑我有以下模型定义,我想要一个特定的属性,从创建时起它应该是不变的

class A
  property :a1, String, :freeze => true
end

有类似的东西吗?或者可能正在使用回调?

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

class YourModel
  property :a1, String

  def a1=(other)
    if a1 
      raise "A1 is allready bound to a value"
    end
    attribute_set(:a1, other.dup.freeze)
  end
end

初始化程序在内部委托给普通的属性编写器,因此当您通过YourModel.new(:a1 => "Your value")初始化属性时,无法使用your_instance.a1 = "your value".更改它。但是当你创建一个新的实例时。 instance = YourModel.new您可以分配一次instance.a1 = "Your Value"

答案 1 :(得分:0)

如果您不需要分配常量,那么

property :a1, String, :writer => :private

before :create do
  attribute_set :a1, 'some value available at creation time'
end

可能就够了