2017-02-17 5 views
0

Ich bin sehr neu in Rails und habe Probleme mit Rails/ActiveRecord anscheinend ignoriert Geltungsbereich auf einer validates_uniqueness_of Deklaration in einem Projekt, das ich geerbt habe. Ich habe folgendes Modell:Rails validates_uniqueness_of Ignorieren des Bereichs

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

Es gibt einen bestehenden Benutzerdatensatz mit einem email von [email protected] und ein brand_id von 1.

Wenn Sie einen anderen Benutzerdatensatz mit einem id von 123 zu aktualisieren versuchen, email von [email protected] und ein brand_id von 2, erhalte ich eine Validation failed: Email has already been taken Fehler.

Ich sehe die folgenden zwei Abfragen nacheinander ausgeführt werden, wenn dieser Fehler auftritt:

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; 

Es sieht aus wie die zweite Abfrage wird die korrekte Einzigartigkeit Prüfung zu tun, aber der erste, der den Umfang ignoriert.

Irgendwelche Tipps, was zu betrachten oder weiter zu debuggen würde geschätzt.

Antwort

0

Es ist nichts falsch mit Ihrer Logik in dem Modell. Es gibt noch etwas, das den Datensatz zum Speichern stoppt.

Können Sie das ganze Modell setzen?

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

Ich habe es auf Devise aufgedeckt, die bestätigt, dass die E-Mail eindeutig ist. –

0

Es stellte sich heraus Devise des „validierbares“ Verhalten zu sein, die seine eigene einzigartige Validierung der E-Mail-Feld hinzugefügt.