如何更新正在验证唯一性的属性

时间:2012-09-18 17:22:17

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2 ruby-on-rails-2

'leave_policies'包含年份,增量和总数字段。

我在LeavePolicy模型中写了“ validates_uniqueness_of:year ”。

update_attributes 即使我没有更新年份字段也无法正常工作。

请指导错误或提出更好的解决方案。

Class LeavePolicy
  validates_uniqueness_of :year
end

@leave_policy 是LeavePolicy的对象

在表中一行:id = 1,year = 1,increment = 2,total_entitled = 3.如果我更新id为1的行,如

@ leave_policy.update_attributes(:total_entitled => 5)

我收到错误“已经过了一年”。

1 个答案:

答案 0 :(得分:0)

您确定没有其他年份为1的行,并且@leave_policy实际上是ID为1的行的实例吗?

如果它实际上是一个新记录,它将以这种方式失败,或者如果有任何其他记录:年= = 1。

对所有属性运行验证,即使您仅在某些属性上使用update_attributes,因此如果年份不是唯一的,即使您只更新增量或total_entitled字段,也会失败。

一般来说,validates_uniqueness本身并不是一个很好的答案,因为检查ruby的竞争条件会阻止它强制执行唯一性,所以我也会将它与数据库中的唯一键一起使用。

如果您希望在更改其他字段时能够跳过唯一年份验证,则可以在模型上设置属性,然后调用

leave_policy.save(:validate => false) #for rails 3
leave_policy.save(false) #for rails 2

这将跳过所有验证,但伙计,我会三思而后行。 这似乎打败了目的,所以我宁愿追求为什么rails认为你没有一个独特的年份 - 也许你的数据库中的一个看起来会显示那年真的有一个欺骗行== 1.