首页 > 解决方案 > 更有效的 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)如果这对于有几百万个条目的表来说效率不高,是否有更好的(并且仍然是轨道式的)方法来做到这一点?

标签: ruby-on-railsmongoid

解决方案


您可以定义一个方法来查询具有您希望作为一个组唯一的所有字段的记录:

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

推荐阅读