Hej!
Muszę w swojej aplikacji stworzyć “dashboard” z aktywnością osób, które są obserwowane przez aktualnie zalogowanego usera. Żeby nieco ułatwić tą rozmowę ograniczmy się może do prostszego modelu - dashboard ala dribbble. Czyli po prostu “posty” ostatnio dodane przez osoby obserwowane przez zalogowanego usera.
User --> has_many --> Posts
User --> has_many --> UserUsers --> has_many --> Users
UserUsers to głupawa nazwa ale niech zostanie. Otóż, na czym polega moje pytanie - jaki jest najbardziej optymalny sposób pobrania postów obserwowanych userów? Aktualnie robię to w ten sposób, że najpierw pobieram sobie id użytkowników obserwowanych a następnie używam powstałej tablicy numerów ID przy zapytaniu o posty:
Post.where(user_id: array_of_ids)
co oczywiście produkuje zapytanie z wykorzystaniem IN Czy to jest poprawne rozwiązanie problemu? Jak robicie to w swoich aplikacjach? Jak zachowa się IN przy, powiedzmy, tablicy z 10 tysiącami numerów ID ?
Możesz zrobić jak teraz i zacząć się martwić, jak Twoi użytkownicy zaczną obserwować 10000 innych. Możesz dla każdego użytkownika zrobić model Dashboard, do którego będziesz dopisywać nowe posty obserwowanych użytkowników i później pobierać tylko stąd.
i pobierać takie posty wywołując user.users_posts - wykona to jedno zapytanie z dwoma joinami.
O wydajność przyjdzie się martwić raczej dopiero gdy wynik takiego zapytania dla któregoś użytkonwika zwróci dużą liczbę postów (setki tysięcy) które pewnie będziesz chciał jakoś sortować/paginować. Zawsze warto wygenerować trochę danych i sprawdzić jak to się zachowa na konkretnym serwerze/konfiguracji i wersji postgresa.
Dzięki wszystkim! Właśnie o to mi chodziło - czy IN (10k) jest spoko rozwiązaniem bo tak patrząc na surowe zapytanie SQL, to wyglądało by ono dosyć przerażająco