2

私がしようとしているのは、過去 7 日間のインプレッション数 (誰かが投稿を表示したときにインプレッションが作成されます) で投稿を並べ替えることだけです。これは私の名前付きスコープです

scope :popular_last_week, unscoped
    .select("websites.*, COUNT(impressions.id) AS counted_impressions")
    .joins("INNER JOIN impressions ON websites.id = impressions.impressionable_id")
    .where("impressions.created_at >= ?", 7.days.ago)
    .where(:is_published => true)
    .group("websites.id")
    .order("counted_impressions DESC")

(「counted_impressions」は、ポスト レコードでの競合を避けるために使用されます)

ただし、これにより次の無効な SQL が生成されます (counted_impressions は有効な列ではありません)。

SELECT COUNT(*) AS count_all, websites.id AS websites_id FROM "websites" INNER JOIN impressions ON websites.id = impressions.impressionable_id WHERE "websites"."is_published" = 't' AND (impressions.created_at >= '2013-01-11 17:48:03.954542') GROUP BY websites.id ORDER BY counted_impressions

selectステートメントは無視されているようです。どこが間違っているのか、または SQL ステートメントが次のようになるようにするにはどうすればよいですか。

SELECT websites.*, COUNT(impressions.id) AS counted_impressions FROM "websites" INNER JOIN impressions ON websites.id = impressions.impressionable_id WHERE "websites"."is_published" = 't' AND (impressions.created_at >= '2013-01-11 17:42:57.771777') GROUP BY websites.id ORDER BY counted_impressions DESC

4

2 に答える 2

0

これを試して:

  スコープ :popular_last_week、スコープなし
    .select(arel_table[Arel.star])
    .select(Website.arel_table[:id].count.as("counted_impressions"))
    .joins("ウェブサイトの内部結合インプレッション.id = インプレッション.impressionable_id")
    .where("impressions.created_at >= ?", 7.days.ago)
    .where(:is_published => true)
    .group("websites.id")
    .order("counted_impressions DESC")
于 2013-01-19T00:05:53.477 に答える