我有一个具有多个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,因为这似乎是一种更清洁的方法。我不知道为什么它不起作用。有任何想法吗?

最佳答案

您需要并且应该在此处执行joins而不是includes

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

在这方面,includespluck是相对的。一个说要给我所有可能的数据,而另一个说只给我一点。

由于只需要少量数据,因此您要执行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

关于sql - ActiveRecord:不能在带有预先加载的关联的where子句之后使用pluck,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14470027/

10-10 06:47