alias_attribute以及使用原始属性名称创建和方法会导致循环

时间:2010-05-27 19:17:30

标签: ruby-on-rails alias-method alias-method-chain

我试图在我的模型中的一个属性中动态创建方法链。 到现在为止我有这个功能:

def create_filtered_attribute(attribute_name)
          alias_attribute "#{attribute_name}_without_filter", attribute_name

          define_method "#{attribute_name}" do
            filter_words(self.send("#{attribute_name}_without_filter"))
          end
end

所以我收到一个带有属性名称的字符串,别名为' _without_filter '(alias_method或alias_method_chain在这里失败,因为在创建类时属性不存在), 然后我用属性名称创建一个新方法,我在其中过滤其内容。

但不知何故,当我调用“#{attribute_name} _without_filter”时,它调用我的新方法(我认为因为alias_attribute有些如何),程序进入堆栈循环。

我正在尝试重命名该属性,因此我可以将其名称用于方法...

有人可以请教我这个。

1 个答案:

答案 0 :(得分:6)

alias_methodalias_attribute之间存在差异。 alias_method实际上是旧方法的副本,而alias_attribute只定义了新方法,称之为旧方法

请注意,ActiveRecord中的model.attributemodel.attribute=方法只需拨打read_attributewrite_attribute即可,因此您始终可以访问您的属性,即使您覆盖它的getter或setter也是如此:

  define_method "#{attribute_name}" do
    filter_words(self.read_attribute(attribute_name))
  end