ユーザーモデルとストーリーモデルがあります。ユーザーには多くのストーリーがあります。
今日最も多くのストーリーを作成したユーザーの 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...
インクルードはエイリアシングを好まないようです。