3

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

def name
  "sir" + name
end

我试过了,但它导致堆栈溢出。有一种方法可以做到这一点。

更多问题,name 和 self.name 之间有什么区别。

4

3 回答 3

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

但是,说真的,不要这样做。

于 2009-12-15T11:25:58.613 回答
2

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

def name
  "sir" + self[:name]
end
于 2009-12-15T19:09:00.287 回答
0

采用super

Ruby 覆盖方法

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

def name
  "sir #{super}"
end
于 2015-03-20T07:48:50.290 回答