Rails: запрос postgres jsonb с использованием ошибки where - PullRequest
0 голосов
/ 23 февраля 2020

В моей таблице postgres performances есть столбец jsonb с именем authorization, где я храню uuid пользователя в качестве ключа, а уровень его авторизации - в качестве значения, например

{ 'sf4wfw4fw4fwf4f': 'owner', 'ujdtud5vd9': 'editor' }

I используйте приведенный ниже запрос Rails в моей модели Performance для поиска всех записей, владельцем которых является пользователь:

class Performance < ApplicationRecord

      def self.performing_or_owned_by(account)
        left_outer_joins(:artists)
          .where(artists: { id: account } )
          .or(Performance.left_outer_joins(:artists)
            # this is where the error happens
            .where("authorization @> ?", { account => "owner" }.to_json)
          ).order('lower(duration) DESC')
           .uniq
      end

end

Где account - это UUID учетной записи пользователя. Однако, когда я запускаю запрос, я получаю следующую ошибку:

    ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR:  syntax error at or near "@>")
    LINE 1: ..._id" WHERE ("artists"."id" = $1 OR (authorization @> '{"28b5...

Сгенерированный SQL:

SELECT "performances".* FROM "performances" 
LEFT OUTER JOIN "artist_performances" ON "artist_performances"."performance_id" = "performances"."id" 
LEFT OUTER JOIN "artists" ON "artists"."id" = "artist_performances"."artist_id" WHERE ("artists"."id" = $1 OR (authorization @> '{"28b5fc7f-3a31-473e-93d4-b36f3b913269":"owner"}')) 
ORDER BY lower(duration) DESC

Я пробовал несколько вещей, но продолжаю получать ту же ошибку. Куда я иду не так?

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Решение в соответствии с комментарием в исходном вопросе заключается в том, чтобы заключить authorization в двойные кавычки. Например:

.where('"authorization" @> ?', { account => "owner" }.to_json)
0 голосов
/ 24 февраля 2020

Оператор ->> получает поле объекта JSON в виде текста.

Похоже, вам нужен этот запрос:

left_outer_joins(:artists).
  where("artists.id = ? OR authorization ->> ? = 'owner'", account, account).
  order('lower(duration) DESC').
  uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...