我是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来复习这些语法。你也应该!