Techioz Blog

モデル属性をシンボルとして扱う

概要

私のモデルには文字列フィールド(短い)があり、それをdbに保存しますが、これは問題ありません。しかし、文字列ではなく常にシンボルを返すようにしたいのですが、また、この文字列属性にシンボルを割り当てたいと考えています。今やっていることはうまくいきません。

class MyModel < ActiveRecord::Base
  attr_accessible :attr1

  def attr1
    # self.try(:attr1).to_sym # how to return symbol?
  end

  def attr1= value
   #    super.attr1.to_sym # doesn't work either
  end
end

どうすればこれに到達できますか?

解決策

ゲッターを上書きするだけでよいと思います。フィールドの場合、セッターはおそらく正常に機能します。

class MyModel < ActiveRecord::Base  
  def attr1
    attributes['attr1']&.to_sym
  end
end

または、シリアライザーを作成することもできます。

class SymbolSerializer
  def self.dump(obj)
    return unless obj
    obj.to_s
  end

  def self.load(text)
    return unless text
    text.to_sym
  end
end

そして、モデル内で次のようにします。

class MyModel < ActiveRecord::Base
  serialize :attr1, SymbolSerializer
end