在创建回调之前,如何验证是否存在重复记录,如果存在则返回?

时间:2013-11-17 20:12:40

标签: ruby-on-rails activerecord

在创建记录之前,我想验证不存在类似的记录。

当我说类似的时候,我想比较3-4列以查看它们是否具有相同的值,如果它们相同,则不保存并报告验证消息。

这仅在创建时发生,在更新期间可能存在重复等,但在创建期间我不想允许重复。

我该怎么做?即哪个回调最适合这个,以及如何添加到验证错误集合?

2 个答案:

答案 0 :(得分:2)

我会做这样的事情:

validate :has_similar_record, :on => :create

...

private

def has_similar_record
  if <Class>.find_by_column1_and_column2_and_column3(column1, column2, column3).present?
    self.errors.add(:base, "record already exists with similar values")
  end
end

答案 1 :(得分:1)

您可以使用first_or_create链接多个where子句,如果不存在则创建它。

例如。

 Post.where(author: 'tom').where(subject: 'Rails is awesome').first_or_create!

这会引发异常

此处有更多信息,(假设您使用的是Rails 3.2 +)

http://guides.rubyonrails.org/v3.2.14/active_record_querying.html#first_or_create

更新

抱歉,我误解了你的问题。如果对象已存在,则不希望创建该对象。因此,您可以使用exists?方法,该方法可以在模型或关系上调用。

例如。

 post_exists = Post.where(author: 'tom').where(subject: 'Rails is awesome').exists?

如果返回true,我们可以将错误添加到self

 self.errors.add(:post, "already exists") if post_exists == true

这可以包装在自定义验证器方法中,如果post_exists为真,则返回false

def validate_existence_of_post
  post_exists = Post.where(author: 'tom').where(subject: 'Rails is awesome').exists?
  if post_exists == true
    self.errors.add(:post, "already exists")
    return false
  end
  true
end

有关此处http://guides.rubyonrails.org/v3.2.14/active_record_querying.html#existence-of-objects

的更多信息