当我确实包含它时,我将要加入我想要过滤的表,但是当我添加pluck时,加入会消失。有没有办法混合pluck和左连接而无需手动输入'left join'的SQL
这是我的情况:
Select u.id
From users u
Left join profiles p on u.id=p.id
Left join admin_profiles a on u.id=a.uid
Where 2 in (p.prop, a.prop, u.prop)
这样做只是加载所有值:
Users.includes(:AdminProfiles, :Profiles).where(...).map{ |a| a[:id] }
但是当我选择拔出而不是地图时,它不会加入配置文件表。
答案 0 :(得分:2)
你的问题是你正在使用includes
并没有真正进行连接,而是在第一个查询后触发第二个查询以查询关联,在你的情况下你希望它们都是实际上是加入了,所以为了用includes(:something)
替换joins(:something)
并且每件事都应该正常工作。
回复你的评论,我将引用rails guide about active record query interface
中的几个部分来自Solution to N + 1 queries problem
clients = Client.includes(:address).limit(10)
clients.each do |client|
puts client.address.postcode
end
上述代码只执行2次查询,而不是前一种情况下的11次查询:
SELECT * FROM clients LIMIT 10
SELECT addresses.* FROM addresses WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10))
如您所见,两个查询,根本没有联接。
来自Specifying Conditions on Eager Loaded Associations
link
即使Active Record允许您像加入一样指定热切加载关联的条件,但推荐的方法是使用联接。
然后是一个例子:
Article.includes(:comments).where(comments: { visible: true })
这将生成一个包含LEFT OUTER JOIN的查询,而join方法将使用INNER JOIN函数生成一个。
SELECT "articles"."id" AS t0_r0, ... "comments"."updated_at" AS t1_r5 FROM "articles" LEFT OUTER JOIN "comments" ON "comments"."article_id" = "articles"."id" WHERE (comments.visible = 1)
如果没有where条件,这将生成两个查询的正常集合。