0

ユーザーモデルとストーリーモデルがあります。ユーザーには多くのストーリーがあります。

今日最も多くのストーリーを作成したユーザーの 25 人のユーザー レコードと、そのユーザーが作成したストーリーの量を返すスコープを作成したいと考えています。

SO には、active_records クエリに優れた人がいることを知っています。また、私はそのような人ではないことも知っています:-(。助けをいただければ幸いであり、すぐに受け入れられます!

#ソリューションで更新

私は @MrYoshiji の提案に取り組んできましたが、ここに私が思いついたものがあります (私の active_admin ダッシュボードでこのクエリを使用していることに注意してください):

    panel "Today's Top Posters" do
      time_range = Date.today.beginning_of_day..Date.today.end_of_day
      table_for User.joins(:stories)
          .select('users.username, count(stories.*) as story_count')
          .group('users.id')
          .where(:stories => {:created_at => time_range})
          .order('story_count DESC')
          .limit(25) do
              column :username
              column "story_count"
      end
  end

そして、見よ、それはうまくいく!!!!

MrYoshijiの提案の簡略化されたバージョンを試したとき、注意してください:

User.includes(:stories)
    .select('users.username, count(stories.*) as story_count')
    .order('story_count DESC') #with or without the group statement
    .limit(25)

次のエラーが発生しました。

    >   User.includes(:stories).select('users.username, count(stories.*) as story_count').order('story_count DESC').limit(25)
  User Load (1.6ms)  SELECT DISTINCT "users".id, story_count AS alias_0 FROM "users" LEFT OUTER JOIN "stories" ON "stories"."user_id" = "users"."id" ORDER BY story_count DESC LIMIT 25
ActiveRecord::StatementInvalid: PG::Error: ERROR:  column "story_count" does not exist
LINE 1: SELECT  DISTINCT "users".id, story_count AS alias_0 FROM "us...

インクルードはエイリアシングを好まないようです。

4

2 に答える 2

1

Windows で実行しているため、今はテストできません... 試してもらえますか?

User.includes(:stories)
     .select('users.*, count(stories.*) as story_count')
     .group('users.id')
     .order('story_count DESC')
     .where('stories.created_at BETWEEN ? AND ?', Date.today.beginning_of_day, Day.today.end_of_day)
     .limit(25)
于 2013-02-13T00:19:19.390 に答える
0

MrYshiji が示唆するように、.includes を使用すると、エイリアシングの問題が原因で機能しませんでした (詳細については、元の質問を参照してください)。代わりに、次のように .joins を使用して、必要なクエリ結果を取得しました (このクエリは私の active_admin ダッシュボード内にあることに注意してください)。

panel "Today's Top Posters" do
  time_range = Date.today.beginning_of_day..Date.today.end_of_day
  table_for User.joins(:stories)
      .select('users.username, count(stories.*) as story_count')
      .group('users.id')
      .where(:stories => {:created_at => time_range})
      .order('story_count DESC')
      .limit(25) do
          column :username
          column "story_count"
  end
end
于 2013-02-23T21:50:20.383 に答える