2010-01-09 34 views
0

将数据(字段值)存储/加载到数据库中或从数据库加载时,最简单的方法是什么?使用活动记录将数据放入数据库时​​转换数据

我通常转换用户在模型类已经进入价值:

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在内部使用相同的工具。

有没有人有一些好主意?什么是其他方法?

回答

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

0

attribute_normalizer提供漂亮的DSL做这种事情是这样的:

class Klass < ActiveRecord::Base 

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

end 
1

你可以这样你可以使用日期正常AR验证验证回调之前在做这个。

before_validation :convert_date 

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

嗯,但最新的设置方法有什么区别?在验证过程中,只有解析的值可以访问,对吗? – reto 2010-01-15 10:40:30

相关问题