在被称为哈希Rails时,不会触发Getter方法

时间:2016-07-26 03:57:51

标签: ruby-on-rails ruby ruby-on-rails-4

所以我在一个模型中覆盖了一个字段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']它只返回类型转换后的字段,并且不执行覆盖该属性的函数。

我怎么能覆盖一个字段,所以当它被调用时,好像我的模型是一个哈希或正常方式,它总是在类型转换之前返回字段?

2 个答案:

答案 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