Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用“有意”无效数据对模型进行验证_Ruby On Rails_Ruby On Rails 3_Rails Models - Fatal编程技术网

Ruby on rails 使用“有意”无效数据对模型进行验证

Ruby on rails 使用“有意”无效数据对模型进行验证,ruby-on-rails,ruby-on-rails-3,rails-models,Ruby On Rails,Ruby On Rails 3,Rails Models,我使用的数据源非常糟糕。在某些地方,你会期望整数,你会得到三个。在电话号码字段中,您可能会看到电话号码是xxx。有些字段是空白的 这是确定的,因为我正在解析每个字段,所以在我的模型中,三个将作为整数3结束,电话号码等将通过正则表达式提取。该服务的用户知道数据是粗略的和不完整的,因为这是一个不幸的事实,我们的数据源是如何维护的,我们对此无能为力,但加快我们的解析游戏!另一方面,随着我们解析越来越多的原始数据,我们正在缓慢地生成我们自己的数据版本,但这个糟糕的源代码现在必须完成 因此,用户选择他们想

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

这是确定的,因为我正在解析每个字段,所以在我的模型中,三个将作为整数3结束,电话号码等将通过正则表达式提取。该服务的用户知道数据是粗略的和不完整的,因为这是一个不幸的事实,我们的数据源是如何维护的,我们对此无能为力,但加快我们的解析游戏!另一方面,随着我们解析越来越多的原始数据,我们正在缓慢地生成我们自己的数据版本,但这个糟糕的源代码现在必须完成

因此,用户选择他们想要解析的数据,我们尽我们所能,返回部分/不正确的模型。现在,我们要存储的最后一个模型应该得到验证——某些字段不能为null,某些字符串必须遵循某种格式,等等

应用程序的流程是:

用户告诉服务要保存哪些数据 作语法分析 服务一发不可收拾 数据,解析它可以和 返回带有 不管它能检索到什么数据。 我们向用户显示数据, 允许他们改正 以及填写任何必填字段 没有收集任何数据。 此用户更正的数据将被删除 已保存,因此已验证。 如果验证失败,请再次显示数据 为便于用户进行修复,请冲洗& 重复 拥有一个一开始可能完全无效或不包含数据,但最终需要验证的模型的最佳方式是什么?我想到并部分实现的两种方法是:

2个模型-数据模型,具有验证等,以及未经验证的数据模型,不具有验证。原始数据被放入未经确认的数据模型中,直到用户进行了更正,然后将其放入数据模型并尝试验证。 一个模型,带有确认数据标志,验证是手动执行的,而不是Rails的验证。
实际上,我倾向于使用两种模型,但我对Rails还很陌生,所以我认为有一种更好的方法可以做到这一点,Rails有一个习惯就是这样让我惊讶:

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

第一个模型,负责解析和呈现并尽其所能,不应该对保存它有任何验证或限制。但是,它应该在迁移中具有type列,以便您可以使用继承属性。如果你不知道我在说什么,请阅读大量关于STI的信息,一个好的起点是

第二个模型是您将在应用程序的其余部分中使用的模型,即严格模型,它具有所有验证。每次用户提交经过修改且可能有效的数据时,您的应用程序都会尝试将从参数创建的开放模型的实例移动到第二个模型的实例,并查看其是否有效。如果是,将其保存到数据库中,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
您需要一个非常强烈的控制器动作来促进上述过程,但这应该不会太难。在应用程序的其余部分中,确保在文章模型上运行查询,只返回有效的查询


希望这有帮助

使用一个模型应该足够简单。您需要一个属性/方法来确定是否应该执行验证。您可以通过:if=>绕过/启用它们:

validates_presence_of :title, :if => :should_validate

“应该验证”可以是一个简单的布尔属性,当模型实例是临时的时返回false,也可以是一个更复杂的方法(如果需要)。

Ahh,这就是我所希望的Rails的优点。然而,在实现了这两种方法和我的hornairs上面概述的方法之后,我想我将继续使用2模型路线。它并没有那么圆滑,但允许我更好地区分有效数据和临时数据,这对未来可能很重要。非常感谢你的回复,我还没有看到:如果以前有,毫无疑问它很快就会有用。非常感谢你的澄清,我确实认为这是我要走的路。数据将在请求之间移动,甚至可能在会话之间移动,因此存储临时数据将非常有用;这在未来可能比现在更重要。感谢railsforum链接,非常有用。