我正在尝试重写一个ActiveRecord模型的getter方法。在模型Category
中有一个称为name
的属性,我希望能够做到这样:
def name
name_trans || name
end
如果name_trans
属性不为nil,则返回它,否则返回name
属性。我应该怎么做?
然后可以像这样正常调用:
@category.name
我正在尝试重写一个ActiveRecord模型的getter方法。在模型Category
中有一个称为name
的属性,我希望能够做到这样:
def name
name_trans || name
end
如果name_trans
属性不为nil,则返回它,否则返回name
属性。我应该怎么做?
然后可以像这样正常调用:
@category.name
我希望为重写 getter 方法增加另一种选项,这个选项就是简单地使用:super。
def name
name_trans || super
end
这不仅适用于属性的getter方法,而且也适用于关联的getter方法。
覆盖getter方法并使用read_attribute
无法处理关联对象,但您可以使用alias_method_chain
来解决。
def name_with_override
name_trans || name_without_override
end
alias_method_chain :name, :override
name_with_override
方法。如果您因某种原因想要调用原始方法,可以调用 name_without_override
。 - Patrick Oscitystore :settings, accessors: [:volume_adjustment]
或者使用像 hstore_accessor
这样的宝石 宝石链接
所以你最终使用了模型上的 store
方法,然后要覆盖这些方法,你不能使用 self.read_attribute
,而必须使用 super
,如下所示:
def partner_percentage
super.to_i || 10
end
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