Ruby on rails 验证多态关联模型中的作用域唯一性

Ruby on rails 验证多态关联模型中的作用域唯一性,ruby-on-rails,Ruby On Rails,对,所以我有一个多态关联,允许不同的对象类型被偏爱。所以一个人可以喜欢一种产品,或者一个人,或者其他任何东西。我想做的是防止有人使用favorite模型中的validates唯一性复制favorite class Favorite < ActiveRecord::Base belongs_to :favoritable, :polymorphic => true belongs_to :user attr_accessible :user validates_presen

对,所以我有一个多态关联,允许不同的对象类型被偏爱。所以一个人可以喜欢一种产品,或者一个人,或者其他任何东西。我想做的是防止有人使用favorite模型中的validates唯一性复制favorite

class Favorite < ActiveRecord::Base
 belongs_to :favoritable, :polymorphic => true
 belongs_to :user

 attr_accessible :user

 validates_presence_of :user
 validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] }
end

如果仔细观察,您会发现唯一性验证工作正常:)

查看您添加的数据图像。在图像内部,您可以发现第二条记录没有
有利的
,而第一条记录则不同,因此有两条记录是uniq,它不存在
唯一性的问题
,而是您的逻辑差距

如果您严格地希望避免第二次输入,则将
有利的
保留为必填字段

validates :favoritable_type, :favoritable_id, :presence => true
class收藏夹
很抱歉,这会导致收藏夹存在(0.4ms)从“收藏夹”中选择1作为其中一个(“收藏夹”。“用户id”=36和“收藏夹”。“收藏夹类型”为空且“收藏夹”。“收藏夹id”为空)限制1(0.1ms)回滚在243ms ActiveRecord::RecordInvalid中完成500个内部服务器错误(验证失败:Favoritable类型不能为空,Favoritable不能为空):您还可以通过迁移向表中添加唯一性约束:
add_index(:favorite,[:user_id,:Favoritable_type,:Favoritable_id],:unique=>true,:name=>“allowed_one_favorite”)
Abram:您有没有想到这一点?
validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] }
validates :favoritable_type, :favoritable_id, :presence => true
class Favorite < ActiveRecord::Base

  belongs_to :user
  belongs_to :favoritable, polymorphic: true

  validates :user_id, :favoritable_id, presence: true,
    numericality: { only_integer: true }

  validates :favoritable_type, presence: true,
    inclusion: { 
      in: %w(FirstModelName SecondModelName),
      message: "%{value} is not a valid" 
    }

  validates :user_id, uniqueness: { scope: [ :favoritable_type, :favoritable_id ] }
end