Я установил поле массива PostgreSQL, идентичное этот пример на направляющих. Я запрашиваю эти поля, например:
Book.where("'fantasy' = ANY (tags)")
Но мне нужно запросить обратный этого; все записи, в которых tags не включает слово «фэнтези» (в этом примере).
У кого-нибудь есть руководство? Я не могу найти много документации по работе с полем массива PostgreSQL за пределами вышеупомянутого руководства.





Вы можете свести на нет свое состояние
Book.where("NOT('fantasy' = ANY (tags))")
Таким образом, вы можете изменить запрос, чтобы также получать записи с NULL-записями:
Book.where("NOT('fantasy' = ANY (tags)) or tags IS NULL")
Также вы можете запустить эти запросы в psql и проверить результаты
SELECT * FROM book WHERE NOT('fantasy' = ANY (tags));
SELECT * FROM book WHERE NOT('fantasy' = ANY (tags)) OR tags IS NULL;
SELECT * FROM book WHERE 'fantasy' = ANY (tags)
Может, нет записей без тега «фэнтези»?
@TonyBeninate Попробуйте выполнить эти запросы в psql SELECT * FROM book WHERE NOT ('fantasy' = ANY (tags)); ВЫБЕРИТЕ * ИЗ книги ГДЕ 'фэнтези' = ЛЮБОЙ (теги) Может быть, нет записей без тега 'фантазия'?
Я использовал пример «книга / фантазия» как способ оставаться постоянным с Edgeguides, это не мои фактические данные, я использую archived_by, который содержит значение массива; однако у меня есть много записей, в которых эквивалентный «тег» пуст: user.conversations.last(10).map(&:archived_by) => [nil, nil, nil, nil, nil, nil, nil, nil, nil, [359034]]
Таким образом, вы можете изменить запрос, чтобы получить записи с NULL-записями: Book.where ("NOT ('fantasy' = ANY (tags)) or tags IS NULL")
SHOOT - Мне нужно провести еще несколько тестов, но на первый взгляд кажется, что это работает!
Если вы можете обновить свой ответ, чтобы отразить вышеизложенное, я приму его. СПАСИБО БОЛЬШОЕ
Попробуй это:
Book.where.not('tags @> ARRAY[?]', "fantasy")
Это тот подход, который я пытался заставить работать сам, но по какой-то причине он здесь не дает результатов.
К сожалению, это не дает никаких результатов.