On Thu, Aug 26, 2021 at 1:05 PM Mateusz Urbanski <
[email protected]> wrote:
> Hello, I have the following Sequel query:
>
> * movies = Movie*
> * .select(Sequel[:movies][:id], Sequel.function(:avg,
> Sequel[:ratings][:value]))*
> * .left_outer_join(:ratings, movie_id: :id)*
> * .group_by(Sequel[:movies][:id])*
> * .all*
>
> The query works as expected but I have two problems:
>
> 1. I can't access the average movie rating with dot notation:
>
> *results[2].avg*
>
> *NoMethodError: undefined method `avg' for #<Movie
> @values={:id=>"d1bfc20f-45e0-4b8a-bb5b-d97b920bd408", :avg=>0.35e1}>*
>
> *from (pry):26:in `__pry__'*
>
> *results[2][:avg] *- works as expected
>
This is expected. Non-columns need to be accessed with #[]. If you want
to add an accessor method for avg:
class Movie
def_column_accessor :avg
end
Personally, I recommend using [:avg] instead of .avg for returned values
that are not columns in the model's dataset.
2. How can I get all movie columns at once, *Sequel[:movies][:*] * does not
> work.
>
I'm guessing you want:
Movie.select_all(:movies)
You can use select_append to append to that selection:
Movie.
select_all(:movies).
select_append{avg(ratings[:value])}.
left_outer_join(:ratings, movie_id: :id).
group_by{movies[:id]}.
all
SELECT movies.*, avg(ratings.value)
FROM movies
LEFT OUTER JOIN ratings ON (ratings.movie_id = movies.id)
GROUP BY movies.id
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sequel-talk/CADGZSSeDH8QT3yhyE-XX6%2BDmNBzkNu9raOuPkmkOzeoePip%3DiQ%40mail.gmail.com.