Validar la singularidad del ámbito en modelos de asociación polimórficos.

Bien, tengo una asociación polimórfica que permite favorecer diferentes tipos de objetos. Así que una persona puede preferir un producto, una persona o lo que sea. Lo que quiero hacer es protegerme de que alguien duplique un favorito utilizando la validación de la singularidad en el 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

La validación parece estar funcionando, pero por cualquier motivo, aún se crea una nueva fila de Favoritos con el user_id cuando se intenta duplicar la entrada.

¿Hay alguna manera de detener este guardado inicial?

Parece que Rails está creando la entrada de base de datos y luego la actualiza con el favoritable_id y el favoritable_type de la siguiente manera:

  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

Respuestas a la pregunta(3)

Su respuesta a la pregunta