根据某些记录不存在的条件选择记录

时间:2015-06-30 18:09:31

标签: sql ruby-on-rails activerecord

我正在开发一个用Rails构建的聊天应用程序。要显示我最近聊天的列表:

chats = Chat.where(user_to_id: params[:user_id]).select(:user_from_id).distinct

这样做是从user_to_id是当前用户的聊天表中提取user_from_id。

问题是,这只会显示此人聊过的用户已回复的聊天内容。

我需要更改此查询,或者编写一个新查询,即使没有其他人的响应,也会提取聊天记录。有什么想法吗?

2 个答案:

答案 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_iduser_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。