在数据库中存储/加载数据时,转换数据(字段值)的最简洁方法是什么?
我通常会转换用户在模型类中输入的值:
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在内部使用相同的工具,那将是最好的。
有人有什么好主意吗?还有什么其他方法?
答案 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
但是,您将自己编写验证。它并不理想,但它不应该是那么多代码。
如果您计划在整个应用程序中使用此功能,您应该考虑编写自定义验证程序,您可以在此处获取有关此内容的更多信息:
答案 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