【问题标题】:How do I create this active_records query如何创建此 active_records 查询
【发布时间】:2013-02-13 00:10:04
【问题描述】:

我有一个用户模型和一个故事模型。用户有很多故事。

我想创建一个范围,返回今天创建最多故事的用户的 25 条用户记录,以及他们创建的故事的数量。

我知道 SO 上有些人擅长使用 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

低头看,它有效!!!!

注意,当我尝试简化版的 Yoshiji 先生的建议时:

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...

似乎包含不喜欢任何别名。

【问题讨论】:

    标签: sql ruby-on-rails rails-activerecord


    【解决方案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)
    

    【讨论】:

    • 我们清楚地看到SQL请求没有'count'部分。我将更新我的答案,希望它现在可以工作!
    【解决方案2】:

    正如 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
    

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多