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

发布于 2024-09-03 05:36:28 字数 624 浏览 9 评论 0 原文

我试图在我的模型中的一个属性中动态创建方法链。 现在我有了这个函数:

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),并且程序进入堆栈循环。

我正在尝试重命名该属性,以便我可以使用它的名称作为方法...

有人可以告诉我这一点吗?

Im trying to dynamically create a method chain in one attribute in my model.
By now I have this function:

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

so I receive a string with the attribute name, alias it for '_without_filter' (alias_method or alias_method_chain fails here, because the attribute isnt there when the class is created),
and I create a new method with the attribute name, where I filter its contents.

But somehow, when I call "#{attribute_name}_without_filter" it calls my new method (i think because the alias_attribute some how), and the program goes into a stack loop.

Im trying to rename that attribute, so I can use its name for a method...

Can someone please enlighten me on this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

木格 2024-09-10 05:36:28

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

There is a difference between alias_method and alias_attribute. alias_method actually makes a copy of the old method, whereas alias_attribute just defines new methods, which call old ones.

Note, that model.attribute and model.attribute= methods in ActiveRecord simply call read_attribute and write_attribute, so you always can access your attribute, even if you override it's getter or setter:

  define_method "#{attribute_name}" do
    filter_words(self.read_attribute(attribute_name))
  end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文