2

我的模型有一个字符串字段(一个短的),它将它存储在 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

我如何达到这个目标?

4

2 回答 2

7

我认为你只需要覆盖 getter,如果它是一个字段,setter 可能工作得很好。

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
于 2013-05-07T05:35:36.987 回答
1

如果您需要在多个列或不同模型中执行此操作,我建议您概括解决方案:

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
于 2014-07-12T21:20:12.420 回答