gpt4 book ai didi

ruby-on-rails - 在 Rails 中,我如何 validates_uniqueness_of :field with a scope of last 6 months

转载 作者:行者123 更新时间:2023-12-03 16:01:49 26 4
gpt4 key购买 nike

第一项
我想在将一个字段保存到数据库之前验证它以确保它是唯一的(在过去 6 个月内)。

我想我应该使用 validates_uniqueness_of :field, case_sensitive => false, Scope => ...

对于我的应用程序,如果它是在 <6 个月前使用的,则它必须是唯一的。

想将它与 created_at 进行比较,但真的不知道如何去做。

第二项
我想我应该以某种方式使用 .strip 删除用户可能意外放入的文本之前或之后的任何空格(我知道这些额外的空格默认在 rails 中使用,如果它们在那里可以使文件变得唯一。)

如果有人对如何正确完成此操作有任何提示,我将不胜感激。

最佳答案

validates_uniqueness_of 的工作原理是检查在给定范围内是否已经存在具有给定字段相同值的记录。 :scope 允许您定义唯一性的范围(显然);例如,如果我正在创建博客软件并且希望每个博客只允许使用一个帖子标题,我可以说 validates_uniqueness_of :title, :scope => :blog_id——如果没有范围,我只允许每个标题在整个系统中使用一次. :scope 不会让你做一个复杂的检查,就像你想要的那样。

您可能需要做的是创建自己的验证函数,以检查给定时间范围内相关字段的唯一性(代码在模型中):

validate :field_must_be_unique_within_six_months

def field_must_be_unique_within_six_months
return if field.blank?
num_duplicates = self.class.count(:conditions => ["field = ? AND created_at < ?", self.field, 6.months.ago])
if num_duplicates > 0
errors.add(:field, :taken)
end
end
field_must_be_unique_within_six_months 方法的工作方式与 validates_uniqueness_of 类似,因为如果已经存在具有相同给定字段的记录,它将添加一条错误消息,但添加的条件是它还将检查日期。 validate :field_must_be_unique_within_six_months 将在保存记录时将该方法添加到验证过程中。

要在不违反 DRY 的情况下同时验证多个字段,您可以使用 validates_each 执行以下操作:
validates_each :field1, :field2 do |record, attr, value|
if record.class.exists?(["#{attr.to_s} = ? AND created_at < ?", value, 6.months.ago])
errors.add(attr, :taken)
end
end

在上面的块中, record 是被验证的记录, attr 是属性(所以 field1field2 等), value 是该属性的值。

关于ruby-on-rails - 在 Rails 中,我如何 validates_uniqueness_of :field with a scope of last 6 months,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com