如何找到两个用户的房间

时间:2015-05-30 19:13:51

标签: ruby-on-rails ruby

我正在实施聊天室数据结构。

room.rb

class Room < ActiveRecord::Base
  has_many :room_user_ships
  has_many :users, through: :room_user_ships
end

room_user_ship.rb

class RoomUserShip < ActiveRecord::Base
  belongs_to :room
  belongs_to :user
end

user.rb

class User < ActiveRecord::Base
  has_many :room_user_ships
  has_many :rooms, through: :room_user_ships
end

schema.rb

create_table "rooms", force: true do |t|
  t.datetime "created_at"
  t.datetime "updated_at"
end
create_table "room_user_ships", force: true do |t|
  t.integer  "room_id"
  t.integer  "user_id"
end
create_table "users", force: true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我可以获得用户的房间和房间的用户

room = Room.find(100)
room.users

我的问题是当用户Alex(用户ID:10001)向用户Emma发送消息(用户ID:10002)时,我必须找到这些用户的房间ID,但我不知道该怎么做

迭代所有房间但不是一个好主意。

user = User.find(10001)
receiver = User.find(10002)
user.rooms.each do |room|
  if room.users.include?(receiver)
    the_room = room # find it!
    break
  end
end

2 个答案:

答案 0 :(得分:2)

假设您已经拥有2个用户,那么类似于:

room = Room.joins(:room_user_ships) \
           .where(room_user_ships: { user_id: [user.id, receiver.id] }) \
           .where(room_user_ships: { room_id: user.room_ids }).first

答案 1 :(得分:0)

ActiveRecord joins()方法允许您根据连接对象中的条件查找对象。这里有点复杂,因为用户和接收者都有自己的RoomUserShip。所以你需要用同一个表连接两次。我认为你可以利用User.rooms关系创建的隐式联接,所以希望这可以工作:

user.rooms.
  joins(:room_user_ships).
    where( room_user_ships: {user_id: receiver.id} ).first

查看Activerecord生成的SQL。它应该有两个不同的连接。