使用虚拟属性作为哈希

时间:2012-09-27 19:51:17

标签: ruby ruby-on-rails-3

我希望能够在作为哈希的非数据库模型上拥有虚拟属性。我只是无法弄清楚在这个哈希中添加和删除项目的语法是什么:

如果我定义:

attr_accessor :foo, :bar

然后在模型中的方法中,我可以使用:

self.foo = "x"

但我不能说:

self.bar["item"] = "value"

4 个答案:

答案 0 :(得分:2)

尝试

self.bar = Hash.new
self.bar["item"] = "value"

答案 1 :(得分:1)

class YourModel
  def bar
    @bar ||= Hash.new
  end

  def foo
    bar["item"] = "value"
  end
end

但经典方法是:

class YourModel
  def initialize
    @bar = Hash.new
  end

  def foo
    @bar["item"] = "value"
  end
end

答案 2 :(得分:0)

答案 3 :(得分:0)

当你打电话时:

attr_accessor :foo, :bar
在你的课上,Ruby做了类似下面的事情:

def foo
  return @foo
end
def foo=(val)
  @foo = val
end

def bar
  return @bar
end
def bar=(val)
  @bar = val
end

方法#foo和#bar只是返回实例变量而#foo =和#bar =只是设置它们。因此,如果您希望其中一个包含Hash,则必须在某处分配此Hash。

我最喜欢的解决方案如下:

class YourModel

  # generate the default accessor methods
  attr_accessor :foo, :bar

  # overwrite #bar so that it always returns a hash
  def bar
    @bar ||= {}
  end

end