【问题标题】:Rails Update with ActiveRecord Collection or Array causing ActiveRecord::RecordInvalid errorsRails 使用 ActiveRecord 集合或数组更新导致 ActiveRecord::RecordInvalid 错误
【发布时间】:2017-12-14 19:43:41
【问题描述】:

我们正在通过使用角色的活动记录集合更新项目来为用户访问项目设置角色分配(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 :some_property, ...
  • 类分配具有“validates_uniqueness_of :role_id, scope: :project_id”
  • 您可能应该编辑您的代码 sn-p 以包含它。这绝对与您的错误有关。您可能还应该包含任何定义“订阅”的代码,因为它可能是相关的,我将在答案中解释更多。

标签: ruby-on-rails ruby activerecord ruby-on-rails-5


【解决方案1】:

出现该错误消息是因为您在代码中的某处向项目添加了两次相同的角色。 "validates_uniqueness_of :role_id, scope: :project_id" 行表示您不能将相同的角色 ID 附加到给定项目多次。

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

【讨论】:

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