Activerecord query: sort model by average of association's model
I have a model Place wich have reviews, which have a column stars.
I tried following query:
Place.select('place_id, name, avg(reviews.stars)').join(:reviews).group('place_id, name').order('avg(reviews.stars) desc')
I got following error:
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"
How can he complain about place_id? This column is created by Rails. How can I solve this issue?
My models are:
class Review < ApplicationRecord
belongs_to :place
end
and
class Place < ApplicationRecord
has_many :reviews
end
The schema is as follows:
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
and
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
ruby-on-rails activerecord
add a comment |
I have a model Place wich have reviews, which have a column stars.
I tried following query:
Place.select('place_id, name, avg(reviews.stars)').join(:reviews).group('place_id, name').order('avg(reviews.stars) desc')
I got following error:
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"
How can he complain about place_id? This column is created by Rails. How can I solve this issue?
My models are:
class Review < ApplicationRecord
belongs_to :place
end
and
class Place < ApplicationRecord
has_many :reviews
end
The schema is as follows:
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
and
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
ruby-on-rails activerecord
add a comment |
I have a model Place wich have reviews, which have a column stars.
I tried following query:
Place.select('place_id, name, avg(reviews.stars)').join(:reviews).group('place_id, name').order('avg(reviews.stars) desc')
I got following error:
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"
How can he complain about place_id? This column is created by Rails. How can I solve this issue?
My models are:
class Review < ApplicationRecord
belongs_to :place
end
and
class Place < ApplicationRecord
has_many :reviews
end
The schema is as follows:
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
and
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
ruby-on-rails activerecord
I have a model Place wich have reviews, which have a column stars.
I tried following query:
Place.select('place_id, name, avg(reviews.stars)').join(:reviews).group('place_id, name').order('avg(reviews.stars) desc')
I got following error:
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"
How can he complain about place_id? This column is created by Rails. How can I solve this issue?
My models are:
class Review < ApplicationRecord
belongs_to :place
end
and
class Place < ApplicationRecord
has_many :reviews
end
The schema is as follows:
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
and
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
ruby-on-rails activerecord
ruby-on-rails activerecord
asked Nov 25 '18 at 12:02
AlbertMunichMarAlbertMunichMar
12417
12417
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
join
is a method that is being delegated to underlying records, resulting in Array#join being called directly after your select
.
You want to call joins
instead of join
to construct a proper query. If you take a closer look at your error, you will see that everything after select
has been ignored.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467234%2factiverecord-query-sort-model-by-average-of-associations-model%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
join
is a method that is being delegated to underlying records, resulting in Array#join being called directly after your select
.
You want to call joins
instead of join
to construct a proper query. If you take a closer look at your error, you will see that everything after select
has been ignored.
add a comment |
join
is a method that is being delegated to underlying records, resulting in Array#join being called directly after your select
.
You want to call joins
instead of join
to construct a proper query. If you take a closer look at your error, you will see that everything after select
has been ignored.
add a comment |
join
is a method that is being delegated to underlying records, resulting in Array#join being called directly after your select
.
You want to call joins
instead of join
to construct a proper query. If you take a closer look at your error, you will see that everything after select
has been ignored.
join
is a method that is being delegated to underlying records, resulting in Array#join being called directly after your select
.
You want to call joins
instead of join
to construct a proper query. If you take a closer look at your error, you will see that everything after select
has been ignored.
answered Nov 25 '18 at 12:17
Marcin KołodziejMarcin Kołodziej
4,4901315
4,4901315
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467234%2factiverecord-query-sort-model-by-average-of-associations-model%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown