0

当我包含它时,它左连接了我想要过滤的表,但是当我添加 pluck 时,连接消失了。有没有什么方法可以混合 pluck 和 left join 而无需手动输入“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] }

但是当我做 pluck 而不是 map 时,它不会离开加入配置文件表。

4

1 回答 1

2

您的问题是您使用includeswhich 并没有真正进行连接,而是在第一个查询之后触发第二个查询以查询关联,在您的情况下,您希望它们都被实际连接,因此替换includes(:something)joins(:something)每件事都应该正常工作。

回复您的评论,我将引用Rails 指南中有关活动记录查询接口的几个部分

  1. 从部分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))
    

    如您所见,两个查询,根本没有连接。

  2. 从部分Specifying Conditions on Eager Loaded Associations 链接

    尽管 Active Record 允许您在预先加载的关联上指定条件,就像连接一样,但推荐的方法是使用连接。

    然后是一个例子:

    Article.includes(:comments).where(comments: { visible: true })
    

    这将生成一个包含 LEFT OUTER JOIN 的查询,而 joins 方法将使用 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 条件,这将生成两个查询的正常集合。

于 2015-02-21T06:23:46.163 回答