[英]rails 2.3.8 validates_uniqueness_of with :scope not working
[英]Rails validates_uniqueness_of ignoring scope
我对Rails还是很陌生,但是在我继承的项目中,Rails / ActiveRecord似乎忽略了validates_uniqueness_of
声明的作用域。 我有以下模型:
class User < ActiveRecord::Base
…
validates_uniqueness_of :email, scope: :brand_id, allow_nil: true
…
belongs_to :brand
…
end
有与现有用户记录email
的foo@bar.com
和brand_id
的1
。
尝试更新id
为123
, email
为foo@bar.com
且brand_id
为2
另一个用户记录时,我收到Validation failed: Email has already been taken
错误。
发生此错误时,我看到以下两个查询一个接一个地运行:
SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'foo@bar.com' AND "users"."id" != 123) LIMIT 1;
SELECT 1 AS one FROM "users" WHERE ("users"."email" = 'foo@bar.com' AND "users"."id" != 123 AND "users"."brand_id" = 2) LIMIT 1;
看起来第二个查询正在执行正确的唯一性检查,但是第一个查询忽略了范围。
关于看什么或如何进一步调试的任何技巧将不胜感激。
您的模型中的逻辑没有错。 还有其他一些原因导致记录无法保存。
你能把整个模型放吗?
class Artwork < ApplicationRecord
...
validates_uniqueness_of :artwork_file_name, scope: :game_id
...
end
2.3.1 :810 > Artwork.new(artwork_file_name: 'asd', game_id: 100).save
(12.5ms) BEGIN
Artwork Exists (92.1ms) SELECT 1 AS one FROM `artworks` WHERE `artworks`.`artwork_file_name` = BINARY 'asd' AND `artworks`.`game_id` = 100 LIMIT 1
SQL (64.1ms) INSERT INTO `artworks` (`game_id`, `artwork_file_name`, `created_at`, `updated_at`) VALUES (100, 'asd', '2017-02-17 10:25:25', '2017-02-17 10:25:25')
(17.9ms) COMMIT
=> true
2.3.1 :811 > Artwork.new(artwork_file_name: 'asd', game_id: 100).save
(0.2ms) BEGIN
Artwork Exists (0.5ms) SELECT 1 AS one FROM `artworks` WHERE `artworks`.`artwork_file_name` = BINARY 'asd' AND `artworks`.`game_id` = 100 LIMIT 1
(6.1ms) ROLLBACK
=> false
2.3.1 :812 > Artwork.new(artwork_file_name: 'asd', game_id: 101).save
(0.2ms) BEGIN
Artwork Exists (45.4ms) SELECT 1 AS one FROM `artworks` WHERE `artworks`.`artwork_file_name` = BINARY 'asd' AND `artworks`.`game_id` = 101 LIMIT 1
SQL (6.7ms) INSERT INTO `artworks` (`game_id`, `artwork_file_name`, `created_at`, `updated_at`) VALUES (101, 'asd', '2017-02-17 10:26:05', '2017-02-17 10:26:05')
(6.3ms) COMMIT
=> true
2.3.1 :813 >
事实证明这是Devise的“可验证”行为,它添加了它自己对电子邮件字段的唯一验证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.