0

Rails 4 で仮想属性を割り当てるこれら 2 つの方法の違いを理解しようとしています。テキストフィールドを解析し、コンマで分割してタグフィールドを作成することにより、新しい 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 のどの部分が原因ですか?

4

1 に答える 1

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 の過度の単純化は、モデルのすべてのフィールドに対して最初の例のようなことを行うことだと思います。

于 2013-07-15T13:13:19.783 に答える