Ruby on rails 如何覆盖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

我正在尝试覆盖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
@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推荐的内容: