更有效的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


以上是更有效的Rails方法来检查三个字段中的任何一个是否唯一?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>