如何在ActiveRecord模型中覆盖getter方法?

时间:2014-02-17 17:06:49

标签: ruby-on-rails ruby rails-activerecord getter-setter

我正在尝试覆盖ActiveRecord模型的getter方法。我在模型name中有一个名为Category的属性,我希望能够做到这样的事情:

def name
  name_trans || name
end

如果name_trans属性不是nil,则返回它,否则返回name属性。我该怎么做?

这应该像这样正常调用:

@category.name

6 个答案:

答案 0 :(得分:97)

更新:根据Rails Style Guide的首选方法是使用self[:name]代替read_attributewrite_attribute。我建议您跳过我的回答而不是this one


你可以完全这样做,除了你需要使用read_attribute来实际获取name属性的值并避免递归调用name方法:

def name 
  name_trans || read_attribute(:name)
end

答案 1 :(得分:93)

Rails Style Guide建议self[:attr]使用read_attribute(:attr)

你可以像这样使用它:

def name
  name_trans || self[:name]
end

答案 2 :(得分:14)

我想添加另一个覆盖getter方法的选项,简单来说就是:super。

def name
  name_trans || super
end

这不仅适用于属性getter方法,还适用于关联getter方法。

答案 3 :(得分:5)

覆盖getter并使用read_attribute不适用于关联,但您可以使用alias_method_chain代替。

def name_with_override
  name_trans || name_without_override
end

alias_method_chain :name, :override

答案 4 :(得分:0)

如果有人想在getter方法中更新name_trans之后的值,可以使用self [:name] =。

def name
  self[:name] = name_trans || self[:name]
  # don't do this, it will cause endless loop
  # update(name: name_trans)
end

答案 5 :(得分:0)

您可以使用Rails read_attribute方法。 Rails docs