- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您在记录创建时保存一个 has_many :through 关联,您如何确保该关联具有唯一对象。唯一性由一组自定义属性定义。
考虑:
class User < ActiveRecord::Base
has_many :user_roles
has_many :roles, through: :user_roles
before_validation :ensure_unique_roles
private
def ensure_unique_roles
# I thought the following would work:
self.roles = self.roles.to_a.uniq{|r| "#{r.project_id}-#{r.role_id}" }
# but the above results in duplicate, and is also kind of wonky because it goes through ActiveRecord assignment operator for an association (which is likely the cause of it not working correctly)
# I tried also:
self.user_roles = []
self.roles = self.roles.to_a.uniq{|r| "#{r.project_id}-#{r.role_id}" }
# but this is also wonky because it clears out the user roles which may have auxiliary data associated with them
end
end
根据关联的任意条件验证 user_roles 和角色是否唯一的最佳方法是什么?
最佳答案
最好的方法是在 user_roles
上创建一个唯一的多列索引,尤其是当您使用关系数据库时。
add_index :user_roles, [:user_id, :role_id], 唯一: true
然后在角色添加失败时优雅地处理:
class User < ActiveRecord::Base
def try_add_unique_role(role)
self.roles << role
rescue WhateverYourDbUniqueIndexExceptionIs
# handle gracefully somehow
# (return false, raise your own application exception, etc, etc)
end
end
关系数据库旨在保证引用完整性,因此请将其用于此目的。任何 ruby/rails-only 解决方案都会有竞争条件和/或非常低效。
如果您想提供用户友好的消息传递并勾选“以防万一”,请继续检查:
already_has_role = UserRole.exists?(user: user, role: prospective_role_additions)
不过,当您尝试持续添加角色时,您仍然必须处理潜在的异常。
关于ruby-on-rails - 确保 has_many :through association is unique on creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45112151/
我使用的是基于 Eclipse 3.x 的 WID 6.1。 尝试右键单击文件夹时,新建-> 类,键入类的名称,然后单击完成,出现错误 "Creation of element failed. org
假设我想创建一个浏览器插件,每当某人单击我网页上的按钮时,该插件就会打开他们的软盘驱动器。 (你还记得那个老笑话吗?-别担心,我真的不想这么做。) 创建可在大多数浏览器和大多数操作系统上运行的浏览器插
我目前正在尝试在 Azure 容器实例上创建一个新容器,以在其上部署 .net core 应用程序镜像。 (我是这项技术的新手)。 我在 Azure 上创建了一个容器注册表,并在其上推送了一个镜像(.
我不确定我问的是否正确,但我知道你们都很聪明,能够弄清楚:)。我在压缩一些 python 类中的一些重复代码时遇到了麻烦。这是我的意思的一个例子...... class Parent: PAT
我想要扩展这些 C 预处理器行: #define _POUND_ #define _POUND_ _FALSE 0 _FALSE 展开,最后一行(即_FALSE)展开为0。我知道递归CPP不可能直接实
我需要创建 generic list可以充当List或 List因为我有以下情况。 if(e instanceof A) return A; else return B 但我想填充一个 List Re
我正在尝试构建一个共享对象,以便稍后在其他项目中使用共享对象中的函数 DoSomethingUseful()。它使用外部库以及我在多个项目中使用的一堆 header 。 使用 CMake,我创建了一个
void foo() { //some code MyClass m(); //some more code } C++ 标准是否确保 MyClass 类的构造函数将在 /
我正在尝试在 2D 游戏中创建斜坡。这个斜坡应该有一个 X 度。当现在一个球“滚过”这个斜坡时。这个坡度的效果应该改变,然后球的行为因此向后滚动,向前滚动或在其他地方初始化倾斜度。我认为我可以使用具有
我有一个开发分支,我想看看“分支创建”和现在的区别。实际上,我更感兴趣的是创建分支之后的提交,这更像是“创建分支”+1。 我知道我可以在 Git 命令中使用像 HEAD 和 HEAD~1 这样的简写。
在JavaScript: Understanding the Weird Parts讲师解释说,变量的内存是在所谓的创建阶段设置的(并且 undefined 已分配);然后执行阶段发生。但是,当我们不
我需要NodeJS代码来创建POST请求,以便从URL创建一个FB页面。必须代码有错误,我找不到它。错误消息为请求失败,状态代码为400。我没有包含accesToken字符串,但它存在于我的实际代码中
我开发了一个具有以下特点的 Fortran 代码: 全局变量 13 个带有多个子程序的模块 独立子程序 将英特尔 MKL 库用于 LAPACK 库(线性代数) 读写文本文件 代码变得相当大。即使在这个
我想创建一个数组 ArrayList .我尝试了以下方法: static ArrayList[] displayBlocks = new ArrayList[3]; 但是,我收到编译时错误: gene
云信息supports通过“堆栈创建选项”设置超时。但是这个部分在 serverless.yml 中?有什么解决方法吗? 最佳答案 查看actual code ,TimeoutInMinutes 参数
我们希望只有部分人能够在 Azure DevOps 云(?)存储库中创建“release/*”分支。 不幸的是,我在用户界面中找不到这个选项。我这里也找不到 https://learn.microso
我使用 Azure AD Graph API 差异查询来检测 Azure AD 中的更改。 对于 User 或 Group 类型的每个结果节点,如何区分该对象是新的还是仅更新的? 我使用ocp-aad
我正在发布简单的数据,例如 { "title" : "test Title" } 到(顺其自然)/posts uri,例如类似 RestAssured.baseURI = "http://localh
我正在尝试为撇号创建一个产品引擎。我在扩展“页面设置”表单时遇到问题,目前我想添加一个简单的文本区域来向页面添加概要 - 最终我想添加“产品”设置,但我需要先完成基础知识。 我创建了一个表单和一个设置
我使用 Azure AD Graph API 差异查询来检测 Azure AD 中的更改。 对于 User 或 Group 类型的每个结果节点,如何区分该对象是新的还是仅更新的? 我使用ocp-aad
我是一名优秀的程序员,十分优秀!