对填充的数据库施加约束(具有违反这些约束的记录)

时间:2012-07-04 06:52:05

标签: ruby-on-rails database duplicates activemodel

我有一个模型Clients以及一个包含lastnamefirstname列的相应数据库。最初对[lastname, firstname]的唯一性没有限制,数据库当前包含重复项。我想清理数据库并对模型施加约束,例如:validates_uniqueness_of :lastname, scope: :firstname

我想到的想法是以某种方式备份数据,对空模型数据库施加约束,然后将重复数据拉回来,我现在可以单独处理从异常中抢救。

然而,我觉得我在这里做了一些不切实际的事情。

有没有更好的“轨道方式”来做到这一点?

1 个答案:

答案 0 :(得分:1)

唯一真正发现问题的纯Rails方法是遍历每个模型并确保它仍然有效。例如,粗略地说:

Client.all.each do |client|
  unless (client.valid?)
    puts "Client #{client.id} invalid: #{client.errors.full_messages}"
  end
end

如果需要太多内存,加载all条记录可能不是一个好主意。 ActiveRecord 3.0应该更加明智,将其加载到块中,但我现在无法证明这种情况。

关于您对重复数据的处理方式:

  • 始终在开始使用相应的数据库快照工具之前备份您的表。
  • 始终在数据副本上测试您的修改,然后再在生产数据库上运行。
  • 始终通过编写以可靠且可预测的方式执行操作的Rails迁移来记录您的更改。在部署之前重复测试。

我认为您的生产数据库会按原样进行常规快照,在这种情况下,您可以从中获取测试数据。如果不是这种情况,那么您的首要任务应该是确保它是。