【问题标题】:how to use validates_uniqueness_of with condition如何在条件下使用 validates_uniqueness_of
【发布时间】:2014-05-02 08:31:07
【问题描述】:

我正在使用带有 ruby​​ 的数据映射器。我想在将新数据集插入表之前对其进行验证。我的验证标准是..

1) 仅当字段“名称”不存在时才插入。

2) 如果具有相同'name'的记录已经有'submit_date'(非空),则不插入。

我查看了 dm-validations,我认为 validates_uniqueness_of 应该会有所帮助。 我尝试以下代码

validates_uniqueness_of :submit_date, :scope => :name

但结果并不如我所愿。相同的名字 ' 仍然添加到表中,而其现有的 'name' 已经具有 'submit_date' 值。

id|name|submit_date|
1 |LotA|Null
2 |LotB|2014-05-02
3 |LotB|Null <--- This record should not be added because LotB is existing and already submit
4 |LotC|Null

有什么建议吗?

【问题讨论】:

  • 您也可以创建一个钩子方法并使用before: hook_method_name 来处理这个问题..
  • 您正在验证 submit_date 基于 name 是唯一的,因为与 2014-05-02 相比,nil 是唯一的,这将通过。如果初始记录有nilsubmit_date,你想发生什么?要更新吗?
  • @engineersmnky 是的,我希望 submit_date 对于添加的任何新记录都为零。当名称(比如说 LotB)实际提交时,我希望此表中 LotB 的记录更新 submit_date 的值。但我想阻止(不希望)将重复的 LotB 添加到表中。

标签: ruby validates-uniqueness-of


【解决方案1】:

如果您的意图是首先验证名称的唯一性,那么您可以这样做

validates :name, presence: true, uniqueness:{case_sensitive:false}
validate :exists_with_submit_date

def exists_with_submit_date
    existing_record = self.find_by_name(name) 
    if existing_record && existing_record.submit_date
      errors.add(:name, "all ready exists with submit_date #{existing_record.submit_date}")
    end
end 

【讨论】:

  • 是的,这正是我正在考虑的。非常感谢!
  • case_insensitive 无效,请参阅stackoverflow.com/a/42302131
  • @Cyber​​Mew 感谢您的帮助和回顾过去 :)
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多