获得目标

时间:2017-12-20 11:19:34

标签: ruby-on-rails

我正在构建一个Rails 5应用程序。 在这个应用程序中,我有两个模型,用户和目标。

用户可以有很多目标。

我想创建一个查询,以获得创建最多目标的前五位用户。

这是目标计划

create_table "goals", force: :cascade do |t|
    t.integer  "account_id"
    t.integer  "user_id"
    t.integer  "team_id"
    t.integer  "goal_id"
    t.string   "title"
    t.text     "description"
    t.string   "gtype"
    t.datetime "starts_at"
    t.datetime "ends_at"
    t.string   "status",      default: "ontrack"
    t.string   "privacy"
    t.integer  "progress",    default: 0
    t.datetime "created_at",                      null: false
    t.datetime "updated_at",                      null: false
    t.string   "ancestry"
    t.index ["account_id"], name: "index_goals_on_account_id", using: :btree
    t.index ["goal_id"], name: "index_goals_on_goal_id", using: :btree
    t.index ["team_id"], name: "index_goals_on_team_id", using: :btree
    t.index ["user_id"], name: "index_goals_on_user_id", using: :btree
  end

我试过这个但是我只让用户不是目标最多的用户。

Goal.distinct.order("user_id desc").limit(5)

3 个答案:

答案 0 :(得分:1)

这对你有用。

User.joins(:goals).select("users.*, count(goals.id) as goal_count").group("users.id").order("goal_count DESC").take(5)

答案 1 :(得分:1)

然后最好的方法是使用它来反击get_cache goles_count和order。请参阅此http://railscasts.com/episodes/23-counter-cache-column

然后查询

User.order("users.goles_count DESC").limit(5)

不要忘记为goals_count列编制索引。 其他出路可能是:

User
  .joins(:goals)
  .select("users.*, count(goals.id) as gcount")
  .group("users.id")
  .order("gcount DESC")
  .limit(5)

答案 2 :(得分:0)

您可以尝试使用rails scope方法

class User < ActiveRecord::Base
  scope :top_user, -> (limit) { order("users.goles_count DESC").limit(limit) }
end

您可以在控制器中调用此方法

@top_user = User.top_user(5)