2011-03-03 59 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

相關問題