Activerecord查询:按关联模型的平均值对模型进行排序

时间:2018-11-25 12:02:30

标签: ruby-on-rails activerecord

我有一个模型Place,其中有评论,列中有星星。

我尝试了以下查询:

Place.select('place_id, name, avg(reviews.stars)').join(:reviews).group('place_id, name').order('avg(reviews.stars) desc')

我遇到以下错误:

PG::UndefinedColumn: ERROR: column "place_id" does not exist LINE 1: SELECT place_id, name, avg(reviews.stars) FROM "places" ^ : SELECT place_id, name, avg(reviews.stars) FROM "places"

他如何抱怨place_id?该列由Rails创建。我该如何解决这个问题?

我的模特是:

class Review < ApplicationRecord
  belongs_to :place
end

class Place < ApplicationRecord
  has_many :reviews
end

架构如下:

  create_table "reviews", force: :cascade do |t|
    t.integer "stars"
    t.string "content"
    t.bigint "place_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["place_id"], name: "index_reviews_on_place_id"
  end

  create_table "places", force: :cascade do |t|
    t.bigint "user_id"
    t.string "name"
    t.string "description"
    t.float "lng"
    t.float "lat"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.float "latitude"
    t.float "longitude"
    t.string "address"
    t.index ["user_id"], name: "index_places_on_user_id"
  end

1 个答案:

答案 0 :(得分:1)

join是一种委派给基础记录的方法,导致select之后直接调用Array#join

您想调用joins而不是join来构建适当的查询。如果仔细查看错误,就会发现select之后的所有内容都将被忽略。