将模型属性视为符号

时间:2013-05-07 05:28:13

标签: ruby-on-rails ruby

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

我该如何达到这个目标?

2 个答案:

答案 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