我有一個User
模型與HABTM協會與Tag
模型。我需要所有users
誰必須具備所有條件,而不僅僅是一個。Rails查詢關聯AND
例:
User.includes(:tags).where(tags: { id: [2,3,...] })
返回users
誰擁有tags
ID爲2和/或3,但我想只返回users
誰與IDS 2 tags
和3
我有一個User
模型與HABTM協會與Tag
模型。我需要所有users
誰必須具備所有條件,而不僅僅是一個。Rails查詢關聯AND
例:
User.includes(:tags).where(tags: { id: [2,3,...] })
返回users
誰擁有tags
ID爲2和/或3,但我想只返回users
誰與IDS 2 tags
和3
我能想到的這個選項:
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
,沒有其他的選擇是繼續使用其中軌道上下的方式。
如何:
user_ids = Tag.where(id: [2,3]).pluck(:user_id).uniq
User.where(id: user_id)
pluck
不會實例化的所有標籤的對象,因此,雖然這可能不是理想的,它至少應該是相當快的。
儘管標記對象沒有實例化,但缺點是您正在執行兩個查詢而不是一個查詢。 – MatayoshiMariano
如果有100個'tags.id',該怎麼辦? –
哪個是中間表? – MatayoshiMariano
@ m.simonborg我已經更新了有關100個'tags.id'的問題 – MatayoshiMariano