2013-10-31 24 views
1

如果我想要的一切都在星期日的商店名單,我做如何查詢不具有特定關聯的所有記錄而不將其全部加載到內存中?

Shop.includes(:opening_times).where("opening_times.day =?", 'Sunday') 

有沒有什麼辦法讓一切都在週日關閉的商店名單?也就是說,所有與日欄爲「星期天」的記錄沒有關聯的商店?

我問這個問題here並接受了一個答案。但是,現在我的數據庫變得太大,無法首先將所有打開的商店加載到內存中來解決此問題。有沒有辦法做到這一點,而不先獲得所有開放式商店的數組並將該數組傳回數據庫?

+0

我可能在這裏錯過了一些東西,但是where(「opening_times.day!=?」,'Sunday')'? –

+0

@DamienRoche返回除星期天以外的任何日子。例如,它會返回一個週六和週日開放的商店。 – lala

回答

2

有可能是一個更Railsy的方式,而是用一個單一的查詢(和子查詢):

Shop.where("shop_id NOT IN (select opening_times.shop_id from opening_times where opening_times.day = 'Sunday')") 

或者,基於鏈接的問題,你可以通過使用pluck改善:

shop_ids = Shop.includes(:opening_times).where("opening_times.day = ?", 'Sunday').pluck(:id) 
shops = Shop.where("id NOT IN(?)", shop_ids) 

您正在使用的當前方法(map(&:id))正在爲每一行實例化對象,而pluck(:id)將執行select id查詢。

+0

謝謝你教我如何在一個查詢中做到這一點。我必須使用'shops.id NOT IN'而不是'id NOT IN'來避免模糊的id錯誤。隨着這一變化,它完美的工作。 – lala

+0

@lala沒問題。啊,是的,當然,我會更新答案來反映。 –

0

我不知道我明白你在問什麼,但我會去的。

當我需要查詢的對象有一個關聯,我通常創建一個計數器緩存的#關聯的對象和查詢。因此,在最後,您的查詢應該是這樣的:

Shop.include(:opening_times).where("opening_times.sunday_count", 0)

1

一個更快的方式,而不map將採摘的ID來代替。

open = Shop.includes(:opening_times).where(opening_times: { day: 'Sunday' }).pluck(:id) 
closed = Shop.where.not(id: open) 
相關問題