amd*_*amd 10 sql activerecord arel ruby-on-rails-3
我有一个应用程序,有许多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
Run Code Online (Sandbox Code Playgroud)
当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
Run Code Online (Sandbox Code Playgroud)
我可以得到我正在寻找的结果
@found_ids = ar_query.select(:id).map{|r| r.id}
Run Code Online (Sandbox Code Playgroud)
但我宁愿使用,pluck因为它看起来更干净.但我无法弄清楚为什么它不起作用.有任何想法吗?
Geo*_*off 10
你需要而且应该做joins而不是在includes这里.
这两个函数非常相似,只是joins在查询结果中没有返回数据,而在a中的数据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
如果你通过搜索"rails pluck ambiguous column"来到这里,你可能想知道你可以替换query.pluck(:id)为:
query.pluck("table_name.id")
Run Code Online (Sandbox Code Playgroud)