Rails中多态模型中记录的唯一性验证

时间:2015-10-03 09:34:54

标签: ruby-on-rails ruby-on-rails-4 model polymorphism

所以我有一个头痛的问题试图解决有时只会发生的错误...我有以下模型允许用户喜欢某事:

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的任何其他内容。

关于如何解决这个问题的任何想法?

1 个答案:

答案 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