2013-07-15 64 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的過度簡化是它爲你的第一個例子所有模型的字段做了一些事情。