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