ruby 查询数据库中包含related_model的模型,其中相关模型有2个特定的id

nxagd54h  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(129)

在一个rails应用程序中,我有3个模型,Room,User和UsersRoom,UsersRoom是Room和User之间的关联表。我想查询与多个用户相关的Room。
如果我这样做:

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

字符串
我获取所有房间,其中至少有一个users_room包含一个users_ids。我希望获取每个user_ids都存在users_rooms的房间。
有没有一种干净的方法来做到这一点,而不必在查询房间后循环它们?

dgtucam1

dgtucam11#

我会尝试以下做法:

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)

字符串
备注:

  • select中的COUNT是必需的,因为某些数据库引擎版本在having中使用COUNT时会出现问题,而没有在select部分中定义它。您可以尝试删除该行。
  • join在两个表之间执行INNER JOIN
  • where是你想要的。
  • group将找到的记录分组到一行中,并允许使用COUNT
  • having只返回那些至少关联了user_ids.sizeusers_roomsrooms
2ul0zpep

2ul0zpep2#

我会做:

class Room
  # ...
  has_many :users, though: :users_rooms
end

个字符
创建间接关联是可选的,但是抽象使得查询不受连接表实现方式的约束。
例如,UsersRoom不是一个很好的名字,你可能想叫它更合适的名字,比如Booking-这可以让你在不破坏任何东西的情况下这样做。

相关问题