小编典典

ActiveRecord:不能在带有预先加载的关联的“ where”子句之后使用“ pluck”

sql

我有一个具有多个Post模型的应用程序,每个模型都有belongs_to一个User模型。这些帖子发布后,将PublishedPost创建一个belongs_to与该Post模型相关的模型。

我正在尝试建立一个ActiveRecord查询来查找与用户名匹配的已发布帖子,然后获取那些已发布帖子的ID,但是当我pluck急于加载我的关联并搜索后尝试使用该方法时,出现了一个错误他们用的where方法。

这是我的控制器(的一部分):

class PublishedPostsController < ApplicationController

  def index
    ar_query = PublishedPost.order("published_posts.created_at DESC")

      if params[:searchQuery].present?
        search_query = params[:searchQuery]
        ar_query = ar_query.includes(:post => :user)
                           .where("users.name like ?", "%#{search_query}%")
      end

    @found_ids = ar_query.pluck(:id)

  ...

  end

end

pluck调用该方法时,我得到以下信息:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'users.name' in 'where clause': SELECT id FROM `published_posts`  WHERE (users.name like '%Andrew%') ORDER BY published_posts.created_at DESC

我可以获得想要的结果

@found_ids = ar_query.select(:id).map{|r| r.id}

但我宁愿使用,pluck因为这似乎是一种更清洁的方法。我不知道为什么它不起作用。有任何想法吗?


阅读 172

收藏
2021-04-22

共1个答案

小编典典

您需要并且应该这样做,joins而不是在includes这里。

这两个函数非常相似,只不过joins在查询结果中不返回from的数据,而an中的数据includes则返回。

在这方面,includes并且pluck是对立的。一个告诉我可能的所有数据,而另一个告诉我只给我一点。

由于您只需要少量数据,因此您想做joins。(奇怪的是select,看起来似乎仍然是对立的仍然有效,但是id在这种情况下,您需要消除歧义。)

在控制台中进行尝试,您将看到includes导致如下查询的问题:SELECT "posts"."id" as t0_ro, "posts"."text" as t0_r1, "users"."id" as t1_r0, "users"."name" as t1_r1 ...当您添加一条pluck语句时,所有那些疯狂的tx_ry列都会消失,并被您指定的内容取代。

我希望这会有所帮助,但如果不是这样的话,RailsCast可以。大约在5分钟标记处进行说明。

http://railscasts.com/episodes/181-include-vs-
joins

2021-04-22