【问题标题】:Selecting records based on condition that certain records do not exist根据某些记录不存在的条件选择记录
【发布时间】:2015-06-30 18:09:30
【问题描述】:

我正在开发一个内置于 Rails 的聊天应用程序。为了显示最近的聊天列表,我这样做:

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

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

问题在于,这只会显示与此人聊天的用户已回复的聊天记录。

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

【问题讨论】:

  • 表格中的聊天响应如何显示?也许您可以用更通用的方式重新表述这一点,例如"我想检索 user_from_id 为 NULL 的记录"
  • 也许您也在寻找user_from_id 是当前用户的记录?

标签: sql ruby-on-rails activerecord


【解决方案1】:

您可以使用从用户表开始的左外连接。这将包括用户记录,无论是否有聊天记录。

代码大致如下:

User.joins("left out join chats on (users.id = chats.user_to_id)").where("users.id = ?", params[:user_id])

但是,我认为在用户模型上设置一个 has_many :incoming_chats 可能更容易,使用类似的东西:

has_many :incoming_chats, foreign_key: "user_to_id"

然后您就可以找到您当前的用户,并获取他们传入的聊天记录:

User.find(params[:user_id]).incoming_chats

【讨论】:

    【解决方案2】:

    你可以获取与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
    

    如果你愿意,你可以更聪明一点,选择所有用户(from & to)并在查询后删除你的id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多