ruby-on-rails - 更有效的 Rails 方法来检查三个字段中的任何一个是否唯一?
问题描述
因此,在创建对象之前,我需要检查三个字段的唯一性(从表单),但只要三个字段中的任何一个都是唯一的,我就会创建该对象。
我的第一个想法是将参数从控制器传递给模型,然后运行查询以检查具有这三个字段的查询是否返回 > 0 个文档。但是,我后来了解到这是一种危险的方法,不应该使用。
所以我检查了文档,并基于这个片段
Or even multiple scope parameters. For example, making sure that a teacher can only be on the schedule once per semester for a particular class.
class TeacherSchedule < ActiveRecord::Base
validates_uniqueness_of :teacher_id, scope: [:semester_id, :class_id]
end
我以为我找到了答案,并实施了:
validates_uniqueness_of :link_to_event, :scope => [:name_of_event, :date_of_event]
哪个有效!但是,这个数据集会变得非常大(不仅仅是这个表单,哈哈),我的印象是,通过这个实现,Rails 将查询所有带有 link_to_event 的字段,然后是所有带有name_of_event,然后是带有 date_of_event 的所有字段。所以,我的问题是:
A)我对rails将如何实现这一点错了吗?开箱即用会更有效率吗?
B)如果这对于有几百万个条目的表来说效率不高,是否有更好的(并且仍然是轨道式的)方法来做到这一点?
解决方案
您可以定义一个方法来查询具有您希望作为一个组唯一的所有字段的记录:
validate :uniqueness_of_teacher_semester_and_class
def uniqueness_of_teacher_semester_and_class
users = self.class.where(teacher_id: teacher_id, semester_id: semester_id, class_id: class_id)
errors.add :base, 'Record not unique.' if users.exists?
end
推荐阅读
- functional-programming - 将整数列表转换为包含元素坐标的顶点映射
- python - 如何在带有修改参数的python中将外部函数包含到类中?
- javascript - Redux-Saga 使用 Generator.prototype.next() 失败的错误处理测试
- reactjs - 与组件状态交互时示例代码不起作用 [video.js with react]
- php - 如何将 SSL 相关文件的内容发送到 API 调用 | PHP | 卷曲
- discord.js - 使用后删除命令用法
- excel - 插入带有 Range.top 值作为其顶部值的形状,它会触发对齐问题
- reactjs - 我怎么能在 React 中完成某种全局状态,这么多页面/类可以用按钮更新这个布尔状态
- wordpress - 用于 wordpress 主题的 Azure 管道
- java - Exoplayer 视频支持在发布版本中使应用程序崩溃