दाएं, इसलिए मेरे पास एक पॉलिमॉर्फिक एसोसिएशन है जो विभिन्न ऑब्जेक्ट प्रकारों को पसंद करने की अनुमति देता है। तो एक व्यक्ति एक उत्पाद, या एक व्यक्ति, या जो कुछ भी पसंदीदा कर सकते हैं। मैं जो करना चाहता हूं वह पसंदीदा मॉडल में विशिष्टता को मान्य करते हुए किसी पसंदीदा को डुप्लिकेट करने के खिलाफ सुरक्षा करता है।पॉलिमॉर्फिक एसोसिएशन मॉडल में स्कोप्ड विशिष्टता को मान्य करें
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
सत्यापन काम करने लेकिन जो भी कारण के लिए एक नया पसंदीदा पंक्ति अभी भी user_id साथ बनाई गई है जब एक प्रयास प्रविष्टि नकल के लिए किया जाता रहा है।
वहाँ इस प्रारंभिक बचाने को रोकने के लिए कोई तरीका है?
ऐसा लगता है कि रेल डीबी प्रविष्टि बनाने और फिर favoritable_id और favoritable_type के साथ अद्यतन किया जाता है इस प्रकार है:
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
अब्राहम: क्या आपने कभी यह पता लगा था? – MAckerman