所以我有一个头痛的问题试图解决有时只会发生的错误...我有以下模型允许用户喜欢某事:
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :likeable, polymorphic: true
validates :user, uniqueness: {scope: :likeable}
end
这是一个允许用户喜欢多个其他模型的设置,并且具有防止用户多次喜欢同一事物的验证。
我在调试后发现的事情是rails运行的SELECT查询似乎只检查了likeable_id(而不是likeable_type)的唯一性:
SELECT 1 AS one FROM "likes" WHERE ("likes"."user_id" = 1 AND "likes"."likeable_id" = 4) LIMIT 1
逻辑上,当用户已经喜欢id为4的评论时,他不喜欢具有相同ID的任何其他内容。
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
根据文档,您可以在类型和ID上定义唯一性验证: http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of#893-Does-not-work-with-polymorphic-relations
请更新验证:
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :likeable, polymorphic: true
validates :user, uniqueness: {scope: :likeable_id, :likeable_type}
end