只保留belongs_to 关联的has_many 的COUNT 为2 的记录? 目前我所知道的问题

问题描述

这个问题很容易理解,举个例子:像airbnb一样,客人评价房东,房东评价客人。预订正好有 2 条评论(均在创建预订时创建),并且评论有一个字段 submitted: true/false

假设我们希望在房东的个人资料中显示房东的评论,但假设我们希望排除房东尚未对房客进行评论的任何评论。 (所以即使客人已经评论了主人,在主人回复并评论客人之前,它也不应该显示)。我们该怎么做?

还有一个 Booking has_many Reviews,并且评论在 Host 和 Guest 上是多态的。

目前我所知道的

我想出了各种半解决方案,要么不起作用,要么导致 sql 效率极低。这是一个

bookings_for_host = Booking.where(host_id: 1).pluck(:id) # use host number 1 here for example
all_reviews_for_relevant_bookings = Review.where('booking_id IN (?)',bookings_for_host)

# This doesn't work
all_reviews_for_relevant_bookings
  .select("booking_id")
  .group("booking_id")
  .having("COUNT(booking_id = 2")

上面的代码不仅不起作用,而且效率也很低。

问题

最终,我如何过滤房东的评论,以便不包括属于少于 2 条评论且具有 submitted == true 的预订的评论?

解决方法

我能想到 3 种可能的解决方案

解决方案 1在您的评论表中添加一个布尔值我个人会选择这个

您可以在 host_and_guest_reviewed 表中添加一个布尔值列 bookings,您可以在创建 hostguest 评论后更新该列。然后你所要做的就是检查这个值是否为真。根据您的要求,布尔值列也可能位于评论表中。

解决方案 2使用计数器缓存

每次针对预订创建评论时,预订的计数器都会增加。在这种情况下,您可以有效地清除没有 2 条评论的预订

您可以阅读有关计数器缓存的更多信息 here

解决方案 3自联接 SQL 查询

您可以单独加入评论表,以便仅包含带有另一条预订评论的评论。像这样

Review
  .joins('INNER JOINS reviews reciprocated_reviews ON reviews.id != reciprocated_reviews.id AND reviews.booking_id = reciprocated_reviews.booking_id')

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...