alias_attribute 和使用原始属性名称创建方法会导致循环
我试图在我的模型中的一个属性中动态创建方法链。 现在我有了这个函数:
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),并且程序进入堆栈循环。
我正在尝试重命名该属性,以便我可以使用它的名称作为方法...
有人可以告诉我这一点吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
alias_method
和alias_attribute
之间存在差异。 alias_method 实际上是旧方法的副本,而 alias_attribute 只是定义新方法,调用旧方法。请注意,ActiveRecord 中的
model.attribute
和model.attribute=
方法只需调用 read_attribute 和 write_attribute,因此您始终可以访问您的属性,即使您覆盖它的 getter 或 setter:There is a difference between
alias_method
andalias_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
andmodel.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: