-1

、、の3つのモデルEventCommentありPhotoます。イベントにはとの両方がhas_many :commentsありhas_many :photosます。

私の目標は、過去24時間以内に新しいコメントや写真を受け取ったすべてのイベントを見つけることです。

最近のコメントと最近の写真の2つのイベントが存在するとします。

1つの結合で個別にクエリを実行すると、すべてが期待どおりに機能します。

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の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両方を持ち、photosそれにcomments関連付けられているものだけをもたらします。RDBMSの代わりにを
使用してみて、両方の結果がフェッチされることを確認できます。LEFT JOININNER

于 2013-03-26T17:28:15.493 に答える
1

これはSQLの問題です。INNERJOINではなくLEFTJOINを指定する必要があります。 includeあなたのためにそれをします:

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