我正在开发一个用Rails构建的聊天应用程序。要显示我最近聊天的列表:
chats = Chat.where(user_to_id: params[:user_id]).select(:user_from_id).distinct
这样做是从user_to_id是当前用户的聊天表中提取user_from_id。
问题是,这只会显示此人聊过的用户已回复的聊天内容。
我需要更改此查询,或者编写一个新查询,即使没有其他人的响应,也会提取聊天记录。有什么想法吗?
答案 0 :(得分:0)
您可以从用户表开始使用左外连接。这将包括用户记录,无论是否有聊天记录。
代码大概是:
User.joins("left out join chats on (users.id = chats.user_to_id)").where("users.id = ?", params[:user_id])
但是,我认为在User模型上使用类似的东西设置has_many:incoming_chats可能更容易:
has_many :incoming_chats, foreign_key: "user_to_id"
然后你可以找到你当前的用户,并获得他们的来访:
User.find(params[:user_id]).incoming_chats
答案 1 :(得分:0)
您可以与user_to_id
或user_from_id
进行所有聊天,并获取其他值:
User.select("IF(user_to_id = #{params[:user_id]}, user_from_id, user_to_id) user_id").where('user_from_id = :u_id OR user_to_id = :u_id', u_id: params[:user_id]).distinct
如果您愿意,您可以更聪明,并选择所有用户(来自& to)并在查询后删除您的ID。