Jeden użytkownik może należeć do kilku kont (firm)

Cześć,

Mam dwa modele: User i Account z relacjami między sobą has_many_and_belongs_to.

User posiada pole current_account_id, czyli obecnie aktywne konto firmy na którym pracuje.

W pasku nawigacji chcę pokazać nazwę aktualnie wybranej firmy, aktualnie w application_controller mam taki kod:

def current_account
    # find account assigned to current_user
    if current_user
      Account.find current_user.current_account_id
    end
  end

Teraz przy każdym żądaniu jest wywoływana ta metoda i połączenie z bazą danych. Na pewno da się to zrobić lepiej, ale zastanawiam się w jaki sposób?
Dodam, że ta wartość może się zmienić w każdej chwili, kiedy User zmieni aktualnie wybraną firmę na inną.

Mozna by to trzymać w ciasteczku lub w sesji (ze wskazaniem na sesję) i aktualizować przy zmianie.

No tak, tylko co kiedy użytkownik zaloguje się z innego komputera lub trybu prywatnego?

System wybierze mu losowe konto, a on zacznie grzebać przy nie tym koncie co trzeba (bo wcześniej przecież było inne i nic nie zmieniał).

Równie dobrze może zdarzyć się sytuacja, ze ktoś otworzy drugie okno przeglądarki i zmieni tam firmę, myśląc, ze w ten sposób będzie miał dwie niezależne sesje. Taka architektura to proszenie się o kłopoty, dlatego też do takich sytuacji stosuje się subdomeny.

1 Like

Pierwszy przykład jaki przychodzi mi na myśl to NewRelic. U nich dokładnie masz coś takiego, że możesz mieć wiele “kont”. Rozwiązują to tak, że URLu zawsze masz id aktualnego “konta” na którym pracujesz https://rpm.newrelic.com/accounts/XXXX/applications.

W ten sposób masz rozwiązany problem o którym mówi @mdrozdziel - jeżeli ktoś chce pracować na dwóch kontach jednocześnie to proszę bardzo.