我的模型有一个字符串字段(短)并将其存储在db fine 中。但我希望它总是返回一个符号而不是字符串,而且,我还想为这个字符串属性分配一个符号。我现在正在做的事情不起作用。
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
我该如何达到这个目标?
答案 0 :(得分:6)
我认为你只需要覆盖getter,如果它是一个字段,setter可能工作正常。
class MyModel < ActiveRecord::Base
def attr1
self.attributes['attr1'].to_sym
end
end
或者你也可以创建一个Serializer:
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
答案 1 :(得分:0)
如果您需要在多个列或不同模型中执行此操作,我建议概括解决方案:
class MyModel < ActiveRecord::Base
include Concerns::Columnable
treat_as_symbols :attr1
end
module Concerns::Columnable
extend ActiveSupport::Concern
included do
def self.treat_as_symbols *args
args.each do |column|
define_method "#{column}" do
read_attribute(column.to_sym).to_sym
end
end
end
end
end