Phải, vì vậy tôi có một liên kết đa hình cho phép các loại đối tượng khác nhau được ưu tiên. Vì vậy, một người có thể yêu thích một sản phẩm, hoặc một người, hoặc bất cứ điều gì. Những gì tôi muốn làm là bảo vệ chống lại một người nào đó nhân bản một yêu thích bằng cách xác nhận tính duy nhất trong mô hình Yêu thích.Xác nhận tính độc đáo của phạm vi trong các mô hình liên kết đa hình
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
Xác thực có vẻ đang hoạt động nhưng vì lý do gì đó hàng mới yêu thích vẫn được tạo với user_id khi cố gắng sao chép mục nhập.
Có cách nào để dừng lưu lần đầu này không?
Dường như Rails đang tạo ra sự xâm nhập DB và sau đó cập nhật nó với favoritable_id và favoritable_type như sau:
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
Áp-ram: bạn đã bao giờ con số này ra? – MAckerman