0

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

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

然而,我觉得我在这里做了一些不合时宜的事情。

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

4

1 回答 1

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 迁移来记录您的更改。在部署之前反复测试它。

我假设您的生产数据库按原样受到常规快照的影响,在这种情况下,您可以从那里获取测试数据。如果不是这种情况,您的首要任务应该是确保它是。

于 2012-07-04T07:50:37.730 回答