我有一个具有多个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
中返回数据。
在这方面,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
关于sql - ActiveRecord:不能在带有预先加载的关联的where子句之后使用pluck,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14470027/