代码之家  ›  专栏  ›  技术社区  ›  reto

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

  •  0
  • reto  · 技术社区  · 15 年前

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

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

      def date_str
        format_date(self.date)
      end
    
      def date_str=(str)
        self.date = DateParser.parse(str)
      end
    

    ( 注: 内部的日期解析器还不够,它没有涵盖我们的许多区域设置日期符号样式。

    这已经很好地工作了,但是我不让我用通常的ror方法检查有效性,因为我们不存储用户输入的字符串。如果日期有问题,我通常会让解析器函数返回nil,但这不是非常用户友好的“我不能真正判断用户是否没有输入任何内容或只是一个无效的值”。

    我正在寻找更好地将转换集成到A::R世界的方法,在这里,如果转换失败,我可以生成一些有用的错误消息。最好的情况是,我可以使用与A::R::适配器内部使用的相同的工具。

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   jonnii    15 年前

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

    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

        2
  •  1
  •   MatthewFord    15 年前

    您可以在验证前回调中这样做,这样就可以在日期上使用正常的ar验证。

    before_validation :convert_date
    
    def convert_date
       self.date = DateParser.parse(self[:date])
    end
    
        3
  •  0
  •   Andrew Nesbitt    15 年前

    这个 attribute_normalizer 提供了一个很好的DSL来完成这样的工作:

    class Klass < ActiveRecord::Base
    
      normalize_attributes :date do |value|
        value.is_a?(String) ? DateParser.parse(value) : nil
      end
    
    end