2017-02-17 104 views
0

我对Rails很陌生,在Rails/ActiveRecord中遇到问题,看起来忽略了我继承的项目中的validates_uniqueness_of声明的范围。我有以下型号:Rails validates_uniqueness_of忽略范围

class User < ActiveRecord::Base 
    … 
    validates_uniqueness_of :email, scope: :brand_id, allow_nil: true 
    … 
    belongs_to :brand 
    … 
end 

有与[email protected]email1一个brand_id现有用户记录。

当试图更新的123id其他用户纪录,[email protected]email2一个brand_id,我得到一个Validation failed: Email has already been taken错误。

我看到下面的两个查询运行一前一后出现此错误:

SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 123) LIMIT 1; 
SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 123 AND "users"."brand_id" = 2) LIMIT 1; 

它看起来像第二个查询是做正确的唯一性检查,但第一个被忽略的范围。

任何提示什么看或如何进一步调试将不胜感激。

回答

0

模型中的逻辑没有任何问题。还有其他的东西会阻止Record保存。

你可以把整个模型?

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 > 
+0

我追踪到设计验证电子邮件是唯一的。 –

0

它原来是设计的“可验证”的行为,它增加了它自己的电子邮件领域的独特验证。