rails / ActiveRecord:如何为特定属性指定不同的类?

时间:2011-03-03 01:33:44

标签: ruby-on-rails ruby activerecord

在rails 3中,我有一个数据库模型,其birthday字段的类型为date。出于各种原因(例如,没有已知年份的日期),我希望将其设为Date以外的类,和/或将某些内容混合到Date类中以用于仅从该属性创建的对象。什么是最好的方法呢?

例如,假设我想做类似的事情:

class BirthDate < Date
  def to_s
    case year
    when 1 # if I store a date with a null year, it sets it to 1
      strftime("%m/%d")
    else
      super
    end
  end
end

那个课确实让我得到了我想要的行为(暂时;我完全有可能在将来修改它),我可以通过以下方式让我的模型让我访问:

class Person < ActiveRecord::Base
  def bday
    BirthDate.new(birthday.year, birthday.month, birthday.day)
  end
end

然后只需将我的观点更改为使用bday而不是生日。这看起来有点浪费(不得不从已创建的对象创建一个新对象 - 更不用说Date似乎没有“复制构造函数”类型的东西?(或者我只是在某处丢失它?)

无论如何,我认为ActiveRecord可能提供的内容可能是:

class Person < ActiveRecord::Base
  class_for :birthday => BirthDate
end

有类似的东西吗?我已经完成了一堆谷歌搜索,并查看了许多文档,但还没有找到它。但是因为我不知道它叫什么,

(或许现在是时候开始深入挖掘资源了 - 我听说这是了解平台的一个好方法。再次,some say otherwise;))

1 个答案:

答案 0 :(得分:1)

您可以手动覆盖属性的getter:

def birthday
  BirthDate.parse(birthday_before_type_cast)
end