代码之家  ›  专栏  ›  技术社区  ›  sarunw

我能为db列的属性实现rails setter和getter吗

  •  3
  • sarunw  · 技术社区  · 15 年前

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

    def name
      "sir" + name
    end
    

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

    还有一个问题,name和self.name之间有什么区别吗?

    3 回复  |  直到 10 年前
        1
  •  8
  •   Community CDub    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
    

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

        2
  •  2
  •   Jeff Schuil    15 年前

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

    def name
      "sir" + self[:name]
    end
    
        3
  •  0
  •   jmjm    10 年前

    使用 super

    Ruby Overriding methods

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

    def name
      "sir #{super}"
    end