所以我在一个模型中覆盖了一个字段getter,所以当访问该字段时它可以做一些事情,但是当我访问该字段时似乎没有被触发,好像我的模型是一个Hash,例如:
class Group < ActiveRecord::Base
def field_name
p "Yeah printing"
self.field_name_before_type_cast
end
end
如果我执行g = Group.first.field_name
它会在控制台Yeah printing
中打印,但如果我执行g = Group.first['field_name']
它只返回类型转换后的字段,并且不执行覆盖该属性的函数。
我怎么能覆盖一个字段,所以当它被调用时,好像我的模型是一个哈希或正常方式,它总是在类型转换之前返回字段?
答案 0 :(得分:2)
您覆盖了field_name
方法。这改变了field_name
方法的行为。而且只有field_name
方法。它并没有神奇地改变任何其他无关方法的行为。
您正在调用未覆盖的[]
方法。因此,它的行为不会改变。如果要更改[]
方法的行为,则需要覆盖[]
方法,而不是其他一些不相关的方法。
[注意:实际上,你没有覆盖它。你覆盖它。这不是一个干净的方式,但与你的问题无关。]
我建议您覆盖方法而不是覆盖它们,并且覆盖它们。像这样:
module WithPrinting
def field_name
p "Yeah printing"
super
end
def [](*args)
p "Yeah printing" if args.length == 1 && args.first == 'field_name'
super
end
end
class Group < ActiveRecord::Base
prepend WithPrinting
end
答案 1 :(得分:0)
您需要添加类似这样的读者和编写器方法
def field_name
@field_name
end
def field_name=(value)
@field_name = your_type_casting_magic(value)
end