【问题标题】:How to update attribute that is being validate for uniqueness如何更新正在验证唯一性的属性
【发布时间】:2012-09-18 17:22:17
【问题描述】:

'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 like

@leave_policy.update_attributes(:total_entitled => 5)

我收到错误“年份已被占用”。

【问题讨论】:

  • 更多代码将使我们更好地帮助您。例如,型号代码以及您尝试过的内容。
  • 是的,你能告诉我们你的更新操作的代码吗?

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


【解决方案1】:

您确定没有其他年份为 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多