Tak, więc mam polimorficzne skojarzenie, które pozwala faworyzować różne typy obiektów. Tak więc osoba może faworyzować produkt, osobę lub cokolwiek innego. Co chcę zrobić, to chronić się przed kimś, kto powiela ulubione za pomocą sprawdzania wyjątkowości w modelu Ulubione.Sprawdzanie unikatowości zakresu w polimorficznych modelach asocjacyjnych
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
Walidacja wydaje się działać, ale z jakiegoś powodu nowego Ulubiony wiersz jest nadal tworzone z user_id gdy podejmowana jest próba powielać ten wpis.
Czy istnieje sposób, aby zatrzymać ten początkowy uratować?
Wydaje się, że Rails jest stworzenie wpisu DB i następnie aktualizowanie go z favoritable_id i favoritable_type następująco:
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
Abram: czy kiedykolwiek tego dowiedzieć? – MAckerman