我是Rails的新手,因此无法为此找到任何东西。

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

评论属于用户和产品,而用户和产品均为“ has_many”。

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

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

最佳答案

您可以通过模型验证轻松地做到这一点,索引也将有所帮助。但是,警告是,如果在没有附带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开发人员,我仍然经常参考the ActiveRecord docs来复习这些语法。你也应该!

09-30 17:35
查看更多