我正在构建一个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)
答案 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)