Ruby on rails 基于行值对一列进行唯一验证,对第二列进行条件验证

Ruby on rails 基于行值对一列进行唯一验证,对第二列进行条件验证,ruby-on-rails,postgresql,ruby-on-rails-5,Ruby On Rails,Postgresql,Ruby On Rails 5,我有一个数据库,其中电子邮件被设置为具有状态的唯一验证。我已将作用域设置为int“status”,当特定帐户处于活动状态时,该值为1。 所以,如果用户切换他的国家,他的帐户状态将切换为0,并使用相同的电子邮件创建一个新帐户,状态设置为1。 为了解决这个问题,我在“email”和“status”上使用了一个复合唯一键 validates :email, uniqueness: { scope: :status } 那么,让我们进行一次小的试运行。 目前,用户在X国家/地区,其电子邮件为abc@x

我有一个数据库,其中电子邮件被设置为具有状态的唯一验证。我已将作用域设置为int“status”,当特定帐户处于活动状态时,该值为1。 所以,如果用户切换他的国家,他的帐户状态将切换为0,并使用相同的电子邮件创建一个新帐户,状态设置为1。 为了解决这个问题,我在“email”和“status”上使用了一个复合唯一键

validates :email, uniqueness: { scope: :status }
那么,让我们进行一次小的试运行。 目前,用户在X国家/地区,其电子邮件为abc@xyz.com 所以数据库可能看起来像

email: abc@xyz.com
status: 1
现在如果他去Y国 数据库更新为

[for company X]
email: abc@xyz.com
status: 0
[for company Y]
email:abc@xyz.com
status: 1
很好,对吧 但是现在如果我们的旅行者现在去Z国 数据库将被卡住,因为现在公司Y的状态将更新为0,并且由于现在这个组合不是唯一的,所以将返回错误。 此外,这里的挑战性任务是仅使用电子邮件和状态作为关键。 我想要实现的是,对于特定的电子邮件状态:1必须是唯一的,而状态:0可以是任意次数。 所以我试着把这句话写成

validates :email, uniqueness: { scope: :status }, if: :status == 1
但运气不好,因为我无法在模型中获取特定用户的状态值。 提前谢谢!!
PS:我是ROR新手,所以请提供相关链接,以便我可以了解更多xD。

您可能需要重新考虑您的数据库结构

但解决方案之一是:

验证以下项的唯一性:电子邮件、范围::状态、是否::活动?
def激活?
状态==1
结束
检查此验证的api

但我强烈建议您重做数据库结构,以防止在数据库级别发生这种情况。比如:

inactive\u电子邮件表
电子邮件公司
--------------------------------
one@exmaple.com| A
one@example.com| B
one@example.com| C
two@example.com| A
活动电子邮件表
电子邮件公司
--------------------------------
one@example.com|D
two@example.com| E
对于非活动电子邮件模型,您可以:

类不活动邮件
验证以下项的唯一性:电子邮件、范围::公司
结束
对于主动电子邮件模式:

class活动电子邮件
验证以下项的唯一性:电子邮件、范围::公司
结束
通过这种方式,您可以确保每个公司都有唯一的活动电子邮件,并且每个电子邮件一次只能为一个公司活动

现在,您可以在这两个表之间切换电子邮件。您可以使用回调,例如:

保存前:检查公司的电子邮件是否处于非活动状态
def检查公司的电子邮件是否处于非活动状态
如果您的邮箱在哪里(邮箱:email,公司:company)。是否存在?
#从非活动状态删除?或通知用户此电子邮件以前已停用?
结束
结束

Rails是您的朋友。

您可以通过多种方式解决问题,但我将介绍两种方式

  • 您可以按如下方式应用范围

    validates :email, uniqueness: { scope: [:status,:country]}  
    
  • 如果您想用单个字段上的作用域来处理它

    validates :email, uniqueness: { scope: :status }, unless: lambda{ |user| user.status == 0 }
    
  • 如果用户id为x,则上述验证允许多次使用用户id:x,状态:0,但您只能有一个用户id:x,状态1组合