4

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 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.