Ruby on rails Rails验证忽略作用域的唯一性
我对Rails非常陌生,Rails/ActiveRecord似乎忽略了我继承的项目中的Ruby on rails Rails验证忽略作用域的唯一性,ruby-on-rails,activerecord,validates-uniqueness-of,Ruby On Rails,Activerecord,Validates Uniqueness Of,我对Rails非常陌生,Rails/ActiveRecord似乎忽略了我继承的项目中的验证声明的唯一性上的作用域,这让我遇到了麻烦。我有以下型号: class User < ActiveRecord::Base … validates_uniqueness_of :email, scope: :brand_id, allow_nil: true … belongs_to :brand … end 看起来第二个查询正在进行正确的唯一性检查,但第一个查询忽略了范围 如果您
验证声明的唯一性上的作用域,这让我遇到了麻烦。我有以下型号:
class User < ActiveRecord::Base
…
validates_uniqueness_of :email, scope: :brand_id, allow_nil: true
…
belongs_to :brand
…
end
看起来第二个查询正在进行正确的唯一性检查,但第一个查询忽略了范围
如果您有任何关于进一步查看什么或如何调试的提示,我们将不胜感激。模型中的逻辑没有问题。还有其他东西正在阻止记录保存
你能把整个模型放进去吗
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 >
class ArtworkArtwork.new(Artwork_file_name:'asd',game_id:100)。保存
(12.5毫秒)开始
Artwork Exists(92.1ms)从'artworks'中选择1,其中'artworks'。'Artwork\u file\u name`=二进制'asd'和'artworks`.'game\u id`=100限制1
SQL(64.1ms)插入到“artworks”(游戏id)、“artwork”文件名、“created”处、“Update”处)值中(100、“asd”、“2017-02-17 10:25:25”、“2017-02-17 10:25:25”)
(17.9毫秒)提交
=>正确
2.3.1:811>Artwork.new(Artwork_file_name:'asd',game_id:100)。保存
(0.2ms)开始
Artwork Exists(0.5ms)从'artworks'中选择1,其中'artworks'。'Artwork\u file\u name`=二进制'asd'和'artworks`.'game\u id`=100限制1
(6.1ms)回滚
=>错误
2.3.1:812>Artwork.new(Artwork_file_name:'asd',game_id:101)。保存
(0.2ms)开始
Artwork Exists(45.4ms)从'artworks'中选择1,其中'artworks'。'Artwork\u file\u name`=二进制'asd'和'artworks`.'game\u id`=101限制1
SQL(6.7ms)插入'artworks'('game_id'、'artwork_file_name'、'created_at'、'Update_at')值(101、'asd'、'2017-02-17 10:26:05'、'2017-02-17 10:26:05')
(6.3ms)提交
=>正确
2.3.1 :813 >
事实证明,这是Deave的“可验证”行为,这增加了它自己对电子邮件字段的唯一验证。我追踪到Deave,以验证电子邮件的唯一性。
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 >