gpt4 book ai didi

sql - ActiveRecord:不能在 `pluck` 子句后使用 `where` 与预先加载的关联

转载 作者:行者123 更新时间:2023-12-04 03:04:45 26 4
gpt4 key购买 nike

我有一个应用程序,其中包含多个 Post型号,每款belongs_to User模型。当这些帖子发布时,PublishedPost模型创建为 belongs_to相关Post模型。

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

这是(部分)我的 Controller :

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:不能在 `pluck` 子句后使用 `where` 与预先加载的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com