-1

我有三个模型EventCommentPhoto。一个事件同时具有has_many :commentshas_many :photos

我的目标是找到在过去 24 小时内收到新评论和/或照片的所有活动。

假设存在两个事件,一个带有最近的评论,另一个带有最近的照片。

如果我用一个连接单独查询它们,一切都会按预期工作:

Event.joins(:comments).where("comments.created_at >= :today", :today => Time.now.beginning_of_day)

返回:[#<Event id: 1>]

Event.joins(:photos).where("photos.created_at >= :today", :today => Time.now.beginning_of_day)

返回:[#<Event id: 2>]

为什么当我结合两个联接时会出现这种情况:

Event.joins(:comments, :photos)
    .where("comments.created_at >= :today OR photos.created_at >= :today", :today => Time.now.beginning_of_day)

我收到[#<Event id: 2>, #<Event id: 2>]- 两次 #2,但不是 #1?

ARel生成的SQL是

SELECT "events".*
FROM   "events"
       INNER JOIN "comments"
               ON "comments"."event_id" = "events"."id"
       INNER JOIN "photos"
               ON "photos"."event_id" = "events"."id"
WHERE  ( comments.created_at >= '2013-03-25 23:00:00.000000'
          OR photos.created_at >= '2013-03-25 23:00:00.000000' )  
4

2 回答 2

2

我相信是因为INNER JOIN. 此查询将只带来events两者兼有photoscomments与之相关联的查询。
您可以尝试在您的 RDBMS 上使用LEFT JOIN,而不是INNER查看是否获取了两个结果。

于 2013-03-26T17:28:15.493 回答
1

这是一个 SQL 问题:您必须指定 LEFT JOIN 而不是 INNER JOIN。 include会为你做的:

Event.include(:comments, :photos).where(...).uniq
于 2013-03-26T17:24:39.240 回答