2012-01-05 22 views
7

Muszę przeprowadzić walidację, aby upewnić się, że w danej kategorii może istnieć tylko jeden użytkownik w firmie.Potwierdzenie ActiveRecord: unikalność na skojarzeniu

validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Działa z tym wyjątkiem, że komunikat o błędzie jest ustawiony na kluczu :user_id.

Jak mogę zrobić to samo, ale ustawić błąd na kluczu :user (validates :user podaje błąd)?

+0

'sprawdza: użytkownik,: unique => {...} '? – Frost

+0

możliwy duplikat - http://stackoverflow.com/questions/8479113/rails-3-1-custom-validation-message-on-able-of-has-many-through-relations/8479323#8479323 – maprihoda

+0

@Martin Wspomniałem w pytaniu, że to podnosi błąd. Sugerowany duplikat to zupełnie inne pytanie. –

Odpowiedz

7

Oto prosty sposób sprawdź unikatowość i wymuszenie przypisania błędu do atrybutu :user:

class User < ActiveRecord::Base 
    validate :user_unique_per_company_per_category 

    private 

    def user_unique_per_company_per_category 
    if self.class.exists?(:user_id => user_id, :company_id => company_id, :category => category) 
     errors.add :user, 'already exists' 
    end 
    end 
end 

Byłoby lepiej, jak sądzę, gdybyś mógł wymyślić sposób użycia domyślnego sprawdzania poprawności na :user_id, ale może masz specjalny przypadek użycia.

Ponadto, jeśli nie używasz to w formie, można rozważyć przypisanie do :base błąd, ponieważ można mylić przyszłych programistów, którzy oczekują błąd pojawiać się na :user_id:

errors.add :base, 'already exists' 
+0

Tak, zatwierdzenie custome do tej pory jest prawdopodobnie najlepszym wyborem. Nie mogę uwierzyć, że nie możesz zastosować tej walidacji dla użytkownika :(Problem z sprawdzaniem poprawności id_użytkownika jest taki, że nigdy nie jest on używany w interfejsie użytkownika, więc komunikat o błędzie, o którym wspomniano, nie będzie we właściwym miejscu. –

-1

Nie sądzę, że jest to możliwe, ponieważ metoda sprawdzania poprawności ActiveRecord wysyła błędy w sprawdzanej metodzie.

Weryfikacja: użytkownik próbuje wysłać do attr_accessor: użytkownika, który nie istnieje w twoim modelu.

Chociaż, jeśli jesteś po prostu staramy się komunikat o błędzie całkiem można:

alias user user_id 

a następnie użyć: łatwość w walidacji.

validates :user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Na marginesie, nie użyłby użytkownikowi alias raczej coś takiego:

alias the_supplied_user user_id 

A potem w walidacji:

validates :the_supplied_user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 
+1

Cóż, zarówno użytkownik, jak i użytkownik id, istnieją, ponieważ jest to powiązanie. A więc aliasing po prostu złamie wszystko. –

Powiązane problemy