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

它會生成多少個查詢?我猜只是一個。如果它生成兩個查詢,則用'select(:id)'替換'pluck(:id)'。 – coorasse

+0

這樣做的訣竅:)我的跳躍有一種更優雅的方式來寫這個查詢,但我想這真的沒關係,當表現是好的:) –

1

試試這個:

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

編輯

想我發現了問題。假設您的Video模型與Category的關係爲has_many。所以,你應該做的:

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' in'? – Brozorec

+0

引發語法錯誤 –

1

試試這個,

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

參考, https://robots.thoughtbot.com/activerecords-wherenot

+0

仍然是一樣的。我仍然可以在檢索到的集合中找到具有這些錯誤類別的ID爲113的視頻 –

+0

可以向我展示查詢已解僱,還有@ cc.categories –

+0

這是查詢已解僱 SELECT「videos」。「id」AS t0_r0 ,「videos」。「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「videos」LEFT OUTER JOIN「categories_videos」 ON「categories_videos」。「video_id」=「videos」。「id」LEFT OUTER JOIN「categories」ON「categories」。「id」=「categories_videos」。「category_id」WHERE(「categories」。「id」NOT IN 20,21,22)) –