validation多态关联模型中的范围唯一性

是的,所以我有一个多态关联,允许不同的对象类型被collections。 所以一个人可以喜欢一个产品,一个人,或其他什么。 我想要做的是防止有人使用collections夹模型中的validation唯一性来复制collections夹。

class Favorite  true belongs_to :user attr_accessible :user validates_presence_of :user validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] } end 

validation似乎正在起作用,但无论出于何种原因,当尝试复制条目时,仍然使用user_id创建新的Favorite行。

在此处输入图像描述

有没有办法阻止这个初始保存?

似乎Rails正在创建数据库条目,然后使用favoritable_id和favoritable_type更新它,如下所示:

  SQL (28.3ms) INSERT INTO "favorites" ("created_at", "favoritable_id", "favoritable_type", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["created_at", Tue, 14 Aug 2012 10:26:31 UTC +00:00], ["favoritable_id", nil], ["favoritable_type", nil], ["updated_at", Tue, 14 Aug 2012 10:26:31 UTC +00:00], ["user_id", 23]] (7.8ms) COMMIT (0.1ms) BEGIN Favorite Exists (0.3ms) SELECT 1 AS one FROM "favorites" WHERE ("favorites"."user_id" = 23 AND "favorites"."id" != 123 AND "favorites"."favoritable_type" = 'Style' AND "favorites"."favoritable_id" = 29) LIMIT 1 (0.2ms) UPDATE "favorites" SET "favoritable_id" = 29, "favoritable_type" = 'Style', "updated_at" = '2012-08-14 10:26:31.943937' WHERE "favorites"."id" = 123 (6.7ms) COMMIT (0.1ms) BEGIN 

如果你仔细观察你可以发现唯一性validation工作正常:)

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

查看您添加的数据图像。 在图像中你可以发现第二条记录没有favouritable而第一条记录则不同,因此2条记录是uniq,它不是uniqueness问题,而是它的逻辑差距。

如果你真的想避免第二次进入,那么保持优惠作为必填字段

 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 

你有没有通过类似的post

Rails 3唯一性validation与多态表上的范围

似乎add_index很重要。