2

'leave_policies'year、increment 和 total_entitled字段。

我在 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)

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

4

1 回答 1

0

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

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

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

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

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

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

这将跳过所有验证,但是伙计,我会三思而后行。这似乎违背了目的,所以我会改为追究为什么 Rails 认为你没有独特的年份 - 也许看看你的数据库会显示该年份确实有一个欺骗行 == 1。

于 2012-09-18T17:42:01.587 回答