是的,所以我有一个多态关联,允许不同的对象类型被收藏.所以一个人可以喜欢一个产品,一个人,或其他什么.我想要做的是防止有人使用收藏夹模型中的验证唯一性来复制收藏夹.
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
Run Code Online (Sandbox Code Playgroud)
验证似乎正在起作用,但无论出于何种原因,当尝试复制条目时,仍然使用user_id创建新的Favorite行.
有没有办法阻止这个初始保存?
似乎Rails正在创建数据库条目,然后使用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
Run Code Online (Sandbox Code Playgroud)
San*_*ing 21
如果你仔细观察你可以发现唯一性验证工作正常:)
validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] }
Run Code Online (Sandbox Code Playgroud)
查看您添加的数据图像.你可以发现内部图像没有第二个记录,favouritable
而第一个记录是不同的,因此2个记录是uniq并且它没有问题uniqueness
但是它的逻辑差距.
如果您严格要避免第二次进入,请保留favouritable
为必填字段
validates :favoritable_type, :favoritable_id, :presence => true
Run Code Online (Sandbox Code Playgroud)
class Favorite < ActiveRecord::Base
belongs_to :user
belongs_to :favoritable, polymorphic: true
validates :user_id, :favoritable_id, presence: true,
numericality: { only_integer: true }
validates :favoritable_type, presence: true,
inclusion: {
in: %w(FirstModelName SecondModelName),
message: "%{value} is not a valid"
}
validates :user_id, uniqueness: { scope: [ :favoritable_type, :favoritable_id ] }
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7150 次 |
最近记录: |