我可以为db列的属性实现rails setter和getter

时间:2009-12-15 11:05:50

标签: ruby-on-rails setter getter

在rails中,我们可以通过提供的属性rails访问db列,但是我们可以更改它吗? 例如,我有db with name column我可以实现类似的东西。

def name
  "sir" + name
end

我试过了,但是导致堆栈溢出。有一种方法可以实现这一目标。

更多问题,name和self.name之间是否有任何区别。

3 个答案:

答案 0 :(得分:8)

def name
  "sir" + read_attribute(:name)
end

但要避免这种做法。使用额外的getter / setter,也称为“虚拟属性”。 有关更多信息,请阅读以下答案:decorating an attribute in rails

在你的情况下,还有一个奇怪的副作用。每次访问该属性时,它都会附加名称。在3次通话后,您最终得到

"sir sir sir name"

确实,你可以做到

def name
  n = read_attribute(:name)
  if /^sir/.match(name)
    n
  else
    "sir #{n}"
  end
end

但是,严肃地说,不要这样做。

答案 1 :(得分:2)

如果您知道可能的并发症,但仍需要这样做,那么:

def name
  "sir" + self[:name]
end

答案 2 :(得分:0)

使用super

Ruby Overriding methods

它有很多解释,但我认为它就像调用已经定义的方法一样简单

def name
  "sir #{super}"
end