使用“故意”无效数据验证模型

时间:2011-01-06 14:21:59

标签: ruby-on-rails ruby-on-rails-3 rails-models

我正在使用的数据源非常糟糕。有些地方你会期望整数,你得到“三”。在电话号码字段中,您可能会收到“电话号码是xxx”。有些字段只是空白。

这没关系,因为我正在解析每个字段,因此“Three”将在我的模型中以整数3结束,电话号码(等等)将通过正则表达式提取。该服务的用户知道数据是粗略和不完整的,因为这是我们的数据源维护方式的一个不幸的事实,我们无能为力,但加强我们的解析游戏!另外,当我们解析越来越多的原始数据时,我们正在慢慢地生成我们自己的数据版本,但是这个糟糕的来源现在必须要做。

因此用户选择他们想要解析的数据,我们尽我们所能,返回部分/不正确的模型。现在应该验证我们想要存储的最终模型 - 有些字段不能为空,某些字符串必须符合格式等等。

应用程序的流程是:

  1. 用户告诉服务哪些数据 解析。
  2. 服务消失了 数据,解析它可以和 返回部分模型 无论它能检索什么数据。
  3. 我们向用户显示数据, 允许他们进行更正 并填写任何必填字段 没有收集任何数据。
  4. 此用户更正数据 已保存,因此已经过验证。
  5. 如果验证失败,请再次显示数据 供用户修理,冲洗和 重复。
  6. 让模型开始可能完全无效或不包含数据但最终需要验证的最佳方法是什么?我想到(并部分实现)的两种方式是:

    1. 2个模型 - 具有验证等的数据模型和没有验证的UnconfirmedData模型。将原始数据放入UnconfirmedData模型,直到用户进行了更正,然后将其放入数据模型并尝试进行验证。
    2. 一个模型,带有“已确认数据”标记,手动执行验证,而不是Rails验证。
    3. 在实践中我倾向于使用2个模型,但我对Rails很陌生,所以我认为我有更好的方法来做到这一点,Rails有这样的习惯让我感到惊讶:)

2 个答案:

答案 0 :(得分:2)

您必须在请求之间保存数据吗?如果是这样,我将使用您的两种模型格式,但使用单表继承(STI)来保持干燥。

第一个模型,负责解析和渲染以及做最好的模型,不应该对保存它有任何验证或限制。但是,它应该在迁移中具有type列,以便您可以使用继承优势。如果您不知道我在说什么,请阅读有关STI的大量信息,一个好的起点是a definitive guide

第二个模型将是您将在应用程序的其余部分中使用的模型,严格模型,具有所有验证的模型。每次用户提交重新设计且可能有效的数据时,您的应用程序都会尝试将您从params创建的开放模型的实例移动到第二个模型的实例,并查看它是否有效。如果是,将其保存到数据库,type属性将会改变,一切都会很棒。如果它无效,请保存第一个实例,并将第二个实例返回给用户,以便可以使用验证错误消息。

class ArticleData < ActiveRecord::Base
    def parse_from_url(url)
        # parses some stuff from the data source
    end
end

class Article < ArticleData
     validates_presence_of :title, :body
     validates_length_of :title, :greater_than => 20
     # ...
end

你需要一个非常强烈的控制器动作来促进上述过程,但它不应该太困难。在应用程序的其余部分中,请确保在Article模型上运行查询以仅返回有效的查询。

希望这有帮助!

答案 1 :(得分:2)