Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在将记录保存到Rails中的模型中之前,执行检查重复项的功能_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails 在将记录保存到Rails中的模型中之前,执行检查重复项的功能

Ruby on rails 在将记录保存到Rails中的模型中之前,执行检查重复项的功能,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,这就是我的模型中的内容。我想检查重复记录,我不能只使用字段的唯一索引,因为每个工作的联系人都是唯一的)我无法使用以下代码执行此操作。我做错了吗?感谢您的帮助。谢谢 before_save :check_for_duplicates? def check_for_duplicates? JobsPeople.find(:all, :conditions => ["job_id = ? and contact_id = ?", self.job_id, self.contact_id])

这就是我的模型中的内容。我想检查重复记录,我不能只使用字段的唯一索引,因为每个工作的联系人都是唯一的)我无法使用以下代码执行此操作。我做错了吗?感谢您的帮助。谢谢

before_save :check_for_duplicates?

def check_for_duplicates?
  JobsPeople.find(:all, :conditions => ["job_id = ? and contact_id = ?", self.job_id, self.contact_id])
end

我相信这应该是你想要的

class JobsPeople
  validates_uniqueness_of :contact_id, scope: :job_id
end

回调除了运行您让它们运行的代码外,什么也不做。如果要阻止执行某些操作,有两个选项,使用验证或引发错误

在当前代码中,您可以检查运行的查询是否返回任何内容,如果返回,则会引发错误。错误将冒泡到包装保存的事务并触发回滚,然后将错误传播到您的代码中,您可以在其中处理它(如果需要)

before_save :check_for_duplicates?

def check_for_duplicates?
  if JobsPeople.find(:all, :conditions => ["job_id = ? and contact_id = ?", self.job_id, self.contact_id]).any?
    raise 'some error'
  end
end
尽管已经有一个内置的唯一性验证器来处理这种情况

validates :job_id, :uniquness => {:scope => :contact_id, :message => 'must be unique per contact}
当然,这仍然应该使用数据库中的复合唯一索引进行备份,因为存在潜在的竞争条件,其可能性在很大程度上取决于应用程序的行为

# in a migration

add_index :table_name, [:job_id, :contact_id], :unique => true, :name => 'index_job_id_and_contact_id_on_table_name'

您不能在
(工作id、联系人id)
上使用复合唯一索引吗?仅供参考,请记住,使用此类筛选器并不能保证唯一性。大多数情况下,如果某个记录重复,这并不是一个灾难性的问题,但有时它是灾难性的——在这些情况下,您希望确保数据库级别的唯一性。感谢您的详细解释!我有一个关于综合指数的问题。迁移中的这一行是否使联系人id对于每个作业id都是唯一的?没错。数据库创建一个索引,将这两个字段连接起来,因此作业id为140和联系人id为300的字段类似于“140-300”。当然,实际值将取决于数据库,仅以其为例。啊,这清楚地解释了复合索引的工作原理。我不知道它是在幕后串联的。非常感谢。我正在学习用rails做事的新方法!!