0

Я стараюсь, чтобы извлечь все видео, кроме тех, с категориями [20,21,22]Rails where.not пропускает некоторые записи

это мой запрос

@cc = Video.joins(:categories).where.not(categories: { id: [20,21,22]}) 

но когда я @cc.find(113).categories Я получаю это

#<ActiveRecord::Associations::CollectionProxy 
[#<Category id: 21, title: "music">, #<Category id: 22, title: "movies">, 
#<Category id: 28, title: "collage">]> 

Что я делаю неправильно?

+0

Смотрите мой выбор ... – Brozorec

ответ

0

Вы делаете неправильный запрос , Попробуйте с:

Video.where.not(id: Video.joins(:categories).where(categories: { id: [20,21,22]}).pluck(:id)) 
+0

Это работает, но разве это не вопрос избыточного ответа? –

+0

Сколько запросов он генерирует? Думаю, только один. Если он генерирует два запроса, замените 'pluck (: id)' на 'select (: id)'. – coorasse

+0

, который делает трюк :) Я как бы прыгнул, было бы еще несколько «элегантных» способов написания этого запроса, но я думаю, это действительно не имеет значения, когда производительность хорошая :) –

1

Попробуйте это:

array = [21,22,23] 
@cc = Video.joins(:categories).where("category.id not in (?)", array) 

EDIT

Думаю, я запятнать эту проблему. Предположим, что ваша модель Video находится в has_many отношениях с Category. Так что вы должны сделать:

class Video < ActiveRecord::Base 
    has_many :categories 
    has_many :excluded, -> (array) { where("id not in (?)", array) }, class_name: 'Category' 
end 

И вы называете это так:

Video.find(113).excluded([21,22,23]) 
+0

все тот же с редактированием –

+0

, что если вы замените '' в' с any'? – Brozorec

+0

, который вызывает синтаксическую ошибку –

1

Попробуйте это,

@cc = Video.includes(:categories).references(:categories).where.not(categories: { id: [20,21,22]}) 

см, https://robots.thoughtbot.com/activerecords-wherenot

+0

все тот же. Я все еще могу найти видео с идентификатором 113 в найденной коллекции, у которой есть эти неправильные категории. –

+0

может показать мне запрос, а также @ cc.categories –

+0

это запрос. SELECT "videos". "Id" AS t0_r0 , "video". "id_string" AS t0_r1, "videos". "title" AS t0_r2, "videos". "duration" AS t0_r3, "videos". "thumbnail" AS t0_r4, "videos". "rating" AS t0_r5 , "videos". "created_at" AS t0_r6, "videos". "updated_at" AS t0_r7, "categories". "id" AS t1_r0, "categories". "title" AS t1_r1 FROM "видео" LEFT OUTER JOIN "categories_videos" ON "categories_videos". "Video_id" = "videos". "Id" LEFT OUTER JOIN "категории" ON "категории". "Id" = "categories_videos". "Category_id" WHERE ("categories". "Id" NOT IN (20, 21, 22)) –

Смежные вопросы