我正在尝试覆盖ActiveRecord模型的getter方法。我在模型name
中有一个名为Category
的属性,我希望能够做到这样的事情:
def name
name_trans || name
end
如果name_trans
属性不是nil,则返回它,否则返回name
属性。我该怎么做?
这应该像这样正常调用:
@category.name
答案 0 :(得分:97)
更新:根据Rails Style Guide的首选方法是使用self[:name]
代替read_attribute
和write_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