使用活动记录将数据放入数据库时​​转换数据

时间:2010-01-09 10:37:56

标签: ruby-on-rails activerecord

在数据库中存储/加载数据时,转换数据(字段值)的最简洁方法是什么?

我通常会转换用户在模型类中输入的值:

  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在内部使用相同的工具,那将是最好的。

有人有什么好主意吗?还有什么其他方法?

3 个答案:

答案 0 :(得分:1)

你建议的方式很好,另一种选择是做

之类的事情
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

答案 1 :(得分:1)

您可以在验证回调之前执行此操作,这样您就可以在日期使用正常的AR验证。

before_validation :convert_date

def convert_date
   self.date = DateParser.parse(self[:date])
end

答案 2 :(得分:0)

attribute_normalizer提供了一个很好的dsl来做这样的事情:

class Klass < ActiveRecord::Base

  normalize_attributes :date do |value|
    value.is_a?(String) ? DateParser.parse(value) : nil
  end

end