how to improve query using rails and postgres

Viewed 42

I have three models postshas one for post_rating, post_waiting_time

post.rb

name_column      type           example 
id               integer           20
name             string           'welcome'
user_id          integer           1

post_rating.rb

name_column      type           example 
id               integer           10
rating_label     enum           poor,average,great
post_id          integer           20

post_waiting_time.rb

name_column      type           example 
id               integer           10
waiting_label     enum           0-3,4-6,7-10
post_id          integer           20

i try use rating_label, waiting_label in query use eager_load, joins but can't write multi label in query

posts_lists = user.posts.eager_load(:post_rating, :post_waiting_time).where("post_waiting_times.waiting_label = ? ", '0-3')

this query work good with one value but i need multi query use waiting_label for example 0-3, 4-7 i try use IN() but i have error

Post.eager_load(:post_rating, :post_waiting_time).where('post_waiting_times.waiting_label IN( ? )', 'more_30,0-
3')

error message for last query

ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR:  invalid input value for enum tag_label: "more_30,0-3")
LINE 1: ...ERE (post_waiting_times.waiting_label IN( 'more_30,0...

i fix this with write query for filter by rating_label, waiting_label

posts_lists = user.posts
posts_lists.each do |record|
        flag_filter = false
        unless waiting_filter.empty?
          flag_filter = if waiting_filter.include?(record.post_waiting_time.waiting_label)
                          true
                        else
                          false
                        end
        end

        unless rating_filter.empty?
          flag_filter = if rating_filter.include?(record.post_rating.rating_label)
                          true
                        else
                          false
                        end
        end
    if flag 
       puts record
    end 

but this not efficiency way

i use Rails 6, PostgreSQL

1 Answers

You are doing it wrong, you can directly pass an array for comparison in rails. Here is the updated query

Post.eager_load(:post_rating, :post_waiting_time).where(post_waiting_times: {waiting_label: ['more_30','0-3']})

Hope this solves the problem.

Related