2017-08-09 72 views
0

我有一個User模型與HABTM協會與Tag模型。我需要所有users誰必須具備所有條件,而不僅僅是一個。Rails查詢關聯AND

例:

User.includes(:tags).where(tags: { id: [2,3,...] }) 

返回users誰擁有tags ID爲2和/或3,但我想只返回users誰與IDS 2 tags和3

回答

2

我能想到的這個選項:

User.includes(:tags).where(tags: { id: 2 }).where(tags: { id: 3 }) 

如果你有severals tag_ids,如果用戶與T之間的中間表AGS是user_tags

tag_ids = [1, 2, 3, 4, 5] 
where = tag_ids.map do |id| 
    "tags.id = #{id}" 
end.join(" AND ") 

puts where # "tags.id = 1 AND tags.id = 2 AND tags.id = 3 AND tags.id = 4 AND tags.id = 5" 

User.joins("INNER JOIN user_tags ON user_tags.user_id = user.id INNER JOIN tags ON tags.id = user_tags.tag_id").where(where) 

如果您希望繼續使用該includes,沒有其他的選擇是繼續使用其中軌道上下的方式。

+1

如果有100個'tags.id',該怎麼辦? –

+0

哪個是中間表? – MatayoshiMariano

+0

@ m.simonborg我已經更新了有關100個'tags.id'的問題 – MatayoshiMariano

1

如何:

user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq 
User.where(id: user_id) 

pluck不會實例化的所有標籤的對象,因此,雖然這可能不是理想的,它至少應該是相當快的。

+0

儘管標記對象沒有實例化,但缺點是您正在執行兩個查詢而不是一個查詢。 – MatayoshiMariano