Mam modelu konta i modelu użytkownika:walidacji max ilość af związane obiekty
class Account < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
end
użytkownicy należą do konta i konta mają maksymalną użytkownika (inny dla każdego rachunku). Ale w jaki sposób mogę sprawdzić, czy to maksimum nie zostało osiągnięte podczas dodawania nowych użytkowników do konta?
Najpierw próbowałem dodać walidację na 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 to działa tylko jeśli Dodaję jednego użytkownika jednocześnie.
Jeśli dodaję wielu użytkowników za pomocą @account.update_attributes(:users_attributes => ...)
, po prostu przejdzie bezpośrednio, nawet jeśli jest tylko miejsce dla jeszcze jednego użytkownika.
Aktualizacja:
prostu do wyjaśnienia: Obecna metoda sprawdzania poprawności sprawdza, czy account.users.count
jest mniejsza niż account.maximum_amount_of_users
. Tak mówią na przykład, że account.users.count
jest 9 i account.maximum_amount_of_users
wynosi 10, a następnie sprawdzanie poprawności przejdzie bo 9 < 10.
Problemem jest to, że hrabia wrócił z account.users.count
nie wzrośnie aż wszyscy użytkownicy zostały zapisane do bazy danych. Oznacza to, że dodawanie wielu użytkowników w tym samym czasie przejdzie sprawdzanie poprawności, ponieważ liczba użytkowników będzie taka sama aż do momentu, gdy wszyscy zostaną sprawdzeni.
W związku z tym, że askegg zwraca uwagę, czy powinienem dodać również weryfikację do modelu konta? A jak to zrobić?
update_attributes uruchamia sprawdzanie poprawności - przynajmniej w Railsach 2.3.2. Ale problem polega na tym, że metoda sprawdzania poprawności w modelu użytkownika sprawdza, czy nie osiągnięto maksimum w porównaniu do liczby użytkowników, którzy już są na koncie. To znaczy. jeśli max == 10 i users.count == 9, to - podczas dodawania dwóch użytkowników w tym samym czasie - sprawdzanie poprawności jest wykonywane dla obu, ale za każdym razem sprawdzanie, czy 9 <10. Ponieważ users.count nie zwiększy się przed użytkownicy są zapisywani w bazie danych. Ale jak można to potwierdzić na modelu konta? Czy powinienem zastąpić update_attributes itd.? –
Ahh - przepraszam. Update_attribute (zanotuj brakujące "s" na końcu) pomija sprawdzanie poprawności. Mój błąd. Wygląda na to, że Ryan (który ma o wiele więcej Rubyfoo niż ja) odpowiedział na twoje pytanie. Nie wiedziałem, że metoda "rozmiaru" obejmuje niezapisane rekordy. Każdego dnia uczysz się czegoś :) – askegg