簡體   English   中英

使用活動記錄將數據放入數據庫時​​轉換數據

[英]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

但是,您將自己編寫驗證。 這不是理想的方法,但是不應包含太多代碼。

如果您打算在整個應用程序中使用此功能,則可能還應該考慮編寫自定義驗證器,您可以在此處獲取有關此功能的更多信息:

http://marklunds.com/articles/one/312

您可以在驗證前回調中執行此操作,這樣就可以按日期使用常規的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM