Zatwierdź maksymalną ilość powiązanych obiektów
Mam model konta i model użytkownika:
class Account < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
end
Użytkownicy należą do konta, a konto ma maksimum użytkownika (różne dla każdego konta). Ale jak sprawdzić, czy nie osiągnięto tego maksimum podczas dodawania nowych użytkowników do konta?
Najpierw próbowałem dodać walidację użytkownika:
class User < ActiveRecord::Base
belongs_to :account
validate :validate_max_users_have_not_been_reached
def validate_max_users_have_not_been_reached
return unless account_id_changed? # nothing to validate
errors.add_to_base("can not be added to this account since its user maximum have been reached") unless account.users.count < account.maximum_amount_of_users
end
end
Ale działa to tylko wtedy, gdy dodam jednego użytkownika naraz.
Jeśli dodam wielu użytkowników za pośrednictwem@account.update_attributes(:users_attributes => ...)
przechodzi bezpośrednio, nawet jeśli jest miejsce tylko dla jednego użytkownika.
Aktualizacja:
Aby wyjaśnić: Obecna metoda walidacji to potwierdzaaccount.users.count
jest mniej niżaccount.maximum_amount_of_users
. Powiedzmy na przykład toaccount.users.count
wynosi 9 iaccount.maximum_amount_of_users
wynosi 10, a walidacja zakończy się, ponieważ 9 <10.
Problem polega na tym, że licznik wróciłaccount.users.count
nie zwiększy się, dopóki wszyscy użytkownicy nie zostaną zapisani w bazie danych. Oznacza to, że dodawanie wielu użytkowników w tym samym czasie przejdzie walidację, ponieważ liczba użytkowników będzie taka sama aż do momentu, gdy wszystkie zostaną zweryfikowane.
Tak jakpytać wskazuje, czy powinienem dodać walidację do modelu konta? A jak to zrobić?