как улучшить запрос с помощью рельсов и postgres - PullRequest
4 голосов
/ 12 июля 2020

У меня три модели posts есть одна для 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

Я пытаюсь использовать rating_label, wait_label в запросе, используйте eager_load, joins, но не могу написать мульти-метку в запросе

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

этот запрос работает хорошо с одним значением, но мне нужно использовать несколько запросов, например, wait_label 0-3, 4-7 я пытаюсь использовать IN() but i have error

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

сообщение об ошибке для последнего запроса

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...

я исправляю это с помощью запроса записи для фильтрации по 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 

, но это не эффективный способ

я использую Rails 6, PostgreSQL

1 Ответ

2 голосов
/ 12 июля 2020

Вы делаете не так, можно напрямую передать массив для сравнения в рельсах. Вот обновленный запрос

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

Надеюсь, это решит проблему.

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