2013-07-15 65 views
0

我试图理解这两种在Rails 4中分配虚拟属性的方式之间的区别。其中一种导致“堆栈层次太深”,其中一个工作正常。我试图通过解析一个文本字段并用逗号分割来创建一个标签字段来使用新的ActiveRecord数组字段。工作代码如下:在Rails中分配虚拟属性

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的哪一部分导致了这一点?

回答

2

stack level too deep错误与导轨无关。任何基本的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)。我会假设ActiveRecord的过度简化是它为你的第一个例子所有模型的字段做了一些事情。