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对;同一用户对不同作品可以有多个评论,不同用户对同一作品也可以有多个评论。
您可以使用validates_uniqueness_of多个属性,如下所示:
validates_uniqueness_of :user_id, :scope => :work_id
Run Code Online (Sandbox Code Playgroud)
那么用户将不被允许评论已经评论过的作品。