Techioz Blog

関連モデルに 2 つの特定の ID がある場合、relative_model を含むモデルのデータベースをクエリします。

概要

Rails アプリには、Room、User、および Room と User 間の関連付けテーブルである UsersRoom の 3 つのモデルがあります。 複数のユーザーに関連するルームをクエリしたいと考えています。

私が行った場合:

Room.includes(:users_rooms).where(users_rooms: { user_id: user_ids }

1 つの users_id を含む少なくとも 1 つの users_room を持つすべてのルームを取得します。 user_idごとにusers_roomsが存在するルームを取得したいと考えています。

部屋をクエリした後にループすることなくこれを行うきれいな方法はありますか?

解決策

私なら次のことを試してみます。

Room
  .select('rooms.*, COUNT(users_rooms.user_id)')
  .joins(:users_rooms)
  .where(users_rooms: { user_id: user_ids })
  .group('rooms.id')
  .having('COUNT(users_rooms.user_id) >= ?', user_ids.size)

ノート: