我正在实施聊天室数据结构。
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
答案 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。它应该有两个不同的连接。