Ruby on rails 如何覆盖ActiveRecord模型中的getter方法?
我正在尝试覆盖ActiveRecord模型的getter方法。我在模型Ruby on rails 如何覆盖ActiveRecord模型中的getter方法?,ruby-on-rails,ruby,rails-activerecord,getter-setter,Ruby On Rails,Ruby,Rails Activerecord,Getter Setter,我正在尝试覆盖ActiveRecord模型的getter方法。我在模型类别中有一个名为名称的属性,我希望能够执行以下操作: def name name_trans || name end @category.name def name name_trans || self[:name] end 如果name\u trans属性不是nil,则返回它,否则返回name属性。我该怎么做 然后,通常应将其称为: def name name_trans || name end @cat
类别中有一个名为名称的属性,我希望能够执行以下操作:
def name
name_trans || name
end
@category.name
def name
name_trans || self[:name]
end
如果name\u trans
属性不是nil,则返回它,否则返回name
属性。我该怎么做
然后,通常应将其称为:
def name
name_trans || name
end
@category.name
def name
name_trans || self[:name]
end
更新:根据的首选方法是使用self[:name]
而不是read\u属性
和write\u属性
。我鼓励你跳过我的答案,而选择我的答案
除了需要使用read\u attribute
实际获取name属性的值并避免对name
方法的递归调用之外,您可以完全像这样做:
def name
name_trans || read_attribute(:name)
end
覆盖getter并使用read\u属性
不适用于关联,但您可以使用alias\u方法链
def name_with_override
name_trans || name_without_override
end
alias_method_chain :name, :override
建议在read\u属性(:attr)
上使用self[:attr]
您可以这样使用它:
def name
name_trans || name
end
@category.name
def name
name_trans || self[:name]
end
如果您使用这样的存储属性
store :settings, accessors: [:volume_adjustment]
或
使用宝石,如
hstore\u存取器
因此,您最终在模型上使用了store
方法,然后要覆盖无法使用的self.read\u attribute
方法,您必须改用super
,如下所示:
def partner_percentage
super.to_i || 10
end
我想添加另一个覆盖getter方法的选项,它很简单:super
def name
name_trans || super
end
这不仅适用于属性getter方法,也适用于关联getter方法。如果有人想在getter方法中更新name\u 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
您可以使用Rails read_属性方法。
为什么更好?不要只是链接到其他网站,在这里包括相关的信息。链接可能会失效,或者更详细一点,请看这里:你能给出一个合适的例子吗?好。我刚刚看到了那张照片。现在,如果我在模型对象上调用name
,将使用
调用name\u,还是不使用
调用name\u?name
现在将使用
调用name\u。如果出于某种原因要调用原始方法,可以调用name\u而不重写。。感谢您的回复//您是否知道为什么Rubocop更喜欢self[:name]
而不是read\u attribute[:name]
?虽然此链接可能会回答问题,但不允许仅链接答案,因此,请从该链接后面的内容为您的答案添加一些上下文。谢谢!:)这是Rails指南当前为getter和setter推荐的内容: