Запрос Activerecord: модель сортировки по средней модели ассоциации - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть модель 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 голосов
/ 25 ноября 2018

join - это метод, который делегируется базовым записям, в результате чего Array # join вызывается сразу после вашего select.

Вы хотите вызвать joinsвместо join для построения правильного запроса.Если вы внимательно посмотрите на свою ошибку, вы увидите, что все после select было проигнорировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...