Rails使用ActiveRecord Collection或Array更新,导致ActiveRecord :: RecordInvalid错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails使用ActiveRecord Collection或Array更新,导致ActiveRecord :: RecordInvalid错误相关的知识,希望对你有一定的参考价值。

我们通过使用活动记录角色集合更新项目来为用户访问项目设置角色分配(project_id,role_id)。

但每隔一段时间我们就会收到一条错误,声明ActiveRecord :: RecordInvalid - 验证失败:已经采取了角色。

我的理解是Rails会自动为我们处理删除和创建作业。我做错了导致这个错误吗?

Class Project 

  has_many :assigned_roles, source: :role, through: :assignments 

....

  def assign_users(user_ids = :all)
    if user_ids == :all
      roles = subscription.roles
    else
      roles = subscription.roles.where(user_id: user_ids)
    end
    update!(assigned_roles: roles)
  end
答案

出现该错误消息是因为您在代码中的某个位置向项目添加了两次相同的角色。行"validates_uniqueness_of :role_id, scope: :project_id"意味着您不能多次为给定项目添加相同的角色ID。

至于重复分配发生的地方,这很棘手。我不知道如何创建subscription.roles,但有时可能会返回重复值。您必须查看整个代码库以找到可能发生的位置。

以上是关于Rails使用ActiveRecord Collection或Array更新,导致ActiveRecord :: RecordInvalid错误的主要内容,如果未能解决你的问题,请参考以下文章

为此使用啥 Rails-ActiveRecord 关联?

Rails使用ActiveRecord Collection或Array更新,导致ActiveRecord :: RecordInvalid错误

使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行

Rails 3 包括翻译 globalize3 activerecord

使用 Rails 6 ActiveRecord 进行完全外连接

使用ActiveRecord的查询:: QueryMethods并返回ActiveRecord_Relation rails