Valide a exclusividade do escopo em modelos de associação polimórfica

Certo, então eu tenho uma associação polimórfica que permite que diferentes tipos de objetos sejam favorecidos. Assim, uma pessoa pode preferir um produto, uma pessoa ou qualquer outra coisa. O que eu quero fazer é proteger contra alguém duplicando um favorito usando valida exclusividade no modelo favorito.

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

A validação parece estar funcionando, mas por alguma razão, uma nova linha Favorite ainda é criada com o user_id quando é feita uma tentativa de duplicar a entrada.

Existe uma maneira de parar este salvamento inicial?

Parece que o Rails está criando a entrada do banco de dados e, em seguida, atualizando-a com o favoritable_id e o favoritable_type da seguinte forma:

  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

questionAnswers(3)

yourAnswerToTheQuestion