我试图理解这两种在Rails 4中分配虚拟属性的方法之间的区别。其中一种方法导致“堆栈级别太深”,其中一种工作正常。我试图通过解析文本字段并用逗号分隔它来创建标记字段来使用新的ActiveRecord数组字段。工作代码如下:
class Post < ActiveRecord::Base
def tags=(s)
self[:tags] = s.split(/,\s+/)
end
end
但是,当我通过分配给类变量来改变它以在此模型中分配标记字段时,它会导致“堆栈级别太深”。
class Post < ActiveRecord::Base
def tags=(s)
self.tags = s.split(/,\s+/)
end
end
有人能解释为什么会发生这种情况吗?似乎使用self.tags
会导致此虚拟属性运行,直到堆栈爆炸。 ActiveRecord的哪一部分会导致这种情况?
答案 0 :(得分:2)
stack level too deep
错误与rails无关。任何基本的Ruby类都可以这样做:
class Post
def tags=(s)
self.tags = s
end
end
> Post.new.tags = "a,b,c"
SystemStackError: stack level too deep
调用self.tags =
只会在同一个对象上重复执行tags=(s)
一遍又一遍。在您的第一个示例中,您是通过self[:tags] =
直接设置属性,而tags=(s)
根本不会重新执行{{1}}。我认为ActiveRecord过于简单化了,就像你的所有模型字段的第一个例子一样。