我有一个具有多个Post模型的应用程序,每个模型都有belongs_to一个User模型。这些帖子发布后,将PublishedPost创建一个belongs_to与该Post模型相关的模型。
Post
belongs_to
User
PublishedPost
我正在尝试建立一个ActiveRecord查询来查找与用户名匹配的已发布帖子,然后获取那些已发布帖子的ID,但是当我pluck急于加载我的关联并搜索后尝试使用该方法时,出现了一个错误他们用的where方法。
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
这两个函数非常相似,只不过joins在查询结果中不返回from的数据,而an中的数据includes则返回。
在这方面,includes并且pluck是对立的。一个告诉我可能的所有数据,而另一个告诉我只给我一点。
由于您只需要少量数据,因此您想做joins。(奇怪的是select,看起来似乎仍然是对立的仍然有效,但是id在这种情况下,您需要消除歧义。)
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列都会消失,并被您指定的内容取代。
SELECT "posts"."id" as t0_ro, "posts"."text" as t0_r1, "users"."id" as t1_r0, "users"."name" as t1_r1 ...
我希望这会有所帮助,但如果不是这样的话,RailsCast可以。大约在5分钟标记处进行说明。
http://railscasts.com/episodes/181-include-vs- joins