我有一个用户模型和一个故事模型。用户有很多故事。
我想创建一个范围,为今天创建了最多故事的用户返回25条用户记录,以及他们创建的故事数量。
我知道有些人在使用active_records查询时非常棒。我也知道我不是那些人之一:-(。帮助会非常感激并且很容易被接受!
#UPDATE解决方案我一直在使用@ 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...
似乎包括不喜欢任何别名。
答案 0 :(得分: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)
答案 1 :(得分: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