4

我是 Rails 新手,无法为此找到一些东西。

在我的应用程序中,我有产品、评论和用户。

评论 belongs_to 用户和产品,而用户和产品都“has_many”评论。

但是,我想限制用户为每个产品输入多个评论(每个产品都是唯一的)。因此,如果用户为产品创建评论并尝试为同一产品撰写另一评论,他们会被告知他们不被允许但可以编辑他们现有的评论。

我的问题是:我应该在控制器级别执行此操作,还是可以通过验证来执行此操作(这似乎是一个更简单的解决方案)?只是不知道如何处理它。

4

2 回答 2

10

您可以通过模型验证轻松地做到这一点,索引也会有所帮助。但是警告,如果您在没有伴随的 ActiveRecord 验证的情况下执行唯一索引,您的保存将静默失败并导致可用性/调试问题。

这应该这样做:

class Review < ActiveRecord::Base
  validates :user_id, :uniqueness => { :scope => :product_id,
    :message => "Users may only write one review per product." }
end

如果要添加索引,请在迁移中尝试:

class AddUniquenessConstraintToReviews < ActiveRecord::Migration
  add_index  :review, [:user_id, :product_id],
    :name => "udx_reviews_on_user_and_product", :unique => true
end

编辑:作为一名全职 Rails 开发人员,我仍然经常参考ActiveRecord 文档,以了解这些东西的语法。你也应该!

于 2013-06-04T14:01:18.423 回答
0

最好在审查模型中进行验证。可以将以下方法添加到验证中。[假设您已正确设置关联]

def validate_only_one_review_per_user
  !(@user.products.include? @product)
end
于 2013-06-04T13:59:38.167 回答