Sprawdź unikalność zakresu w modelach asocjacji polimorficznych

Racja, więc mam powiązanie polimorficzne, które pozwala na faworyzowanie różnych typów obiektów. Więc osoba może ulubić produkt, osobę lub cokolwiek innego. To, co chcę zrobić, to zabezpieczyć się przed tym, aby ktoś powielający ulubione użycie sprawdził wyjątkowość w ulubionym modelu.

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

Sprawdzanie poprawności wydaje się działać, ale z jakiegokolwiek powodu nowy ulubiony wiersz jest nadal tworzony za pomocą id_użytkownika, gdy podejmowana jest próba zduplikowania wpisu.

Czy istnieje sposób, aby zatrzymać ten początkowy zapis?

Wygląda na to, że Railsy tworzą wpis DB, a następnie aktualizują go za pomocą favoritable_id i favoritable_type w następujący sposób:

  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