ActiveRecord 唯一性验证阻止更新

kor*_*rok 6 validation activerecord ruby-on-rails

我正在使用 Rails 编写一个网络应用程序,其中一部分包括让用户能够留下评论。我想在模型中进行验证,review以确保一个用户不能对同一项目留下多个评论,所以我写了这样的:

class NoDuplicateReviewValidator < ActiveModel::Validator
  def validate(record)
    dup_reviews = Review.where({user_id: record.user,
                                work_id: record.work})
    unless dup_reviews.length < 1
      record.errors[:duplicate] << "No duplicate reviews!"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

该验证器具有所需的行为,即它保证用户不能对作品进行两次审查。然而,它有一个不受欢迎的副作用,即用户无法更新他/她留下的现有评论。我正在使用一个非常简单的

def update
  @review.update(review_params)
  respond_with(@work)
end
Run Code Online (Sandbox Code Playgroud)

在评论控制器中。如何更改验证器或更新方法,以便防止重复审查但允许更新?

我对 Rails 和 Web 开发非常陌生,所以我确信我在这里做了一些愚蠢的事情。我没有使用内置unique验证器之一,因为唯一的是user/work对;同一用户对不同作品可以有多个评论,不同用户对同一作品也可以有多个评论。

Sha*_*med 3

您可以使用validates_uniqueness_of多个属性,如下所示:

validates_uniqueness_of :user_id, :scope => :work_id
Run Code Online (Sandbox Code Playgroud)

那么用户将不被允许评论已经评论过的作品。