モデル属性をシンボルとして扱う
概要
私のモデルには文字列フィールド(短い)があり、それを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