![](/img/trans.png)
[英]Is it possible to change active record associations in memory without saving them to the database?
[英]Convert data when putting them into a database using active record
在數據庫中存儲數據或從數據庫中加載數據時最干凈的方法是轉換數據(字段值)。
我通常會轉換用戶在模型類中輸入的值:
def date_str
format_date(self.date)
end
def date_str=(str)
self.date = DateParser.parse(str)
end
( 注意:內部日期解析器還不夠,無論如何,它不能涵蓋我們的許多語言環境日期表示法樣式)。
這已經可以很好地工作了,但是我不讓我用通常的RoR方法檢查有效性,因為我們不存儲用戶輸入的字符串。 如果日期有任何問題,我通常讓解析器函數返回nil,但這不是非常用戶友好的方式–我無法真正判斷用戶是否輸入了任何內容或僅輸入了無效值。
我正在尋找一種將轉換更好地集成到A :: R世界中的方法,如果轉換失敗,我可以在其中生成一些有用的錯誤消息。 最好是,如果我可以使用與A :: R :: Adapter內部使用的相同的工具。
有人有什么好主意嗎? 還有哪些其他方法?
您建議的方式很好,另一種選擇是做類似的事情
attr_accessor :when
before_validation :update_date
def update_date
self.date = parse_date(self.when) if self.when
end
def parse_date(date_as_string)
# do something with the date
end
但是,您將自己編寫驗證。 這不是理想的方法,但是不應包含太多代碼。
如果您打算在整個應用程序中使用此功能,則可能還應該考慮編寫自定義驗證器,您可以在此處獲取有關此功能的更多信息:
您可以在驗證前回調中執行此操作,這樣就可以按日期使用常規的AR驗證。
before_validation :convert_date
def convert_date
self.date = DateParser.parse(self[:date])
end
attribute_normalizer為執行此類操作提供了一個不錯的dsl:
class Klass < ActiveRecord::Base
normalize_attributes :date do |value|
value.is_a?(String) ? DateParser.parse(value) : nil
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.