Pobieranie aktywności obserwowanych osób

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 ?

Z góry dzięki za wskazówki.

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.

1 Like

Na pierwszy rzut oka - a nie mozesz uzyc JOIN-a, przy indeksach to powinno dzialac szybko.

W postgresie takie zapytanie IN (10k) wykona się bardzo szybko, ale możesz też dodać relacje w modelu User:

has_many :posts
has_many :user_users, foreign_key: user_id
has_many :users, through: :user_users, source: users
has_many :users_posts, through: :users, source: :posts

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.

1 Like

Dzięki wszystkim! :wink: 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