2011-03-03 60 views
1

在rails 3中,我有一个数据库模型,它有一个birthday字段,类型为date。由于各种原因(例如没有已知年份的日期),我希望这是除Date之外的其他类别,并且/或者将Date类别中的某些东西与类别中的某个对象混合使用,但只能使用此属性创建的对象。什么是最好的方式去做这件事?rails/ActiveRecord:如何为特定属性指定不同的类?

例如,假设我想要做的事,如:

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 

有没有这样的事情我已经做了一堆的谷歌搜索,并通过多项文件的观看,还没有找到它,但因为我不知道它可能叫什么,所以

(也许是时候开始挖掘thr尽管来源 - 我听说这是了解更多关于平台的好方法。话又说回来,some say otherwise;))

+0

为什么不使用一个混合您的Person类,免去您的“生日”访问? – 2011-03-03 02:02:10

回答

1

可以覆盖手动属性,吸气:

def birthday 
    BirthDate.parse(birthday_before_type_cast) 
end 
+0

这似乎为我在做什么工作,谢谢!但是,我确实有一个后续问题:(1)这与“BirthDate.parse(read_attribute(:birthday))'有什么不同/更好/更糟糕吗? [注意:我终于在源代码中查看了这一点;这是在'LIB/active_record/connection_adapters /抽象/ schema_definitions.rb',并没有什么等为代表的我'class_for'想法。] – lindes 2011-03-03 07:48:48

+0

read_attribute方法实际上type_casts的attribute..so日期对象将是initialized..but birthday_before_type_cast会给日期字段,因为它在数据库中。请参见[链接](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-5B-5D) – rubyprince 2011-03-03 08:53:36

相关问题