我正在使用带有 pg_search gem 的 postgres 全文搜索。搜索本身运行良好,但我需要进一步过滤结果,以下是详细信息:
class Notebook < ActiveRecord::Base
has_many :invites
def self.text_search(query)
if query.present?
search(query)
else
scoped
end
end
笔记本控制器:
def index
if params[:query].present?
@notebooks = Notebook.text_search(params[:query]).includes(:invites).where("invites.email = :email OR notebooks.access = :access OR notebooks.access = :caccess OR notebooks.user_id = :uid", email: current_user.email, access: "open", caccess: "closed", uid: current_user.id)
else
@notebooks = Notebook.includes(:invites).where("invites.email = :email OR notebooks.access = :access OR notebooks.access = :caccess OR notebooks.user_id = :uid", email: current_user.email, access: "open", caccess: "closed", uid: current_user.id)
end
我得到的错误是'缺少表'邀请'的 FROM 子句条目。我尝试了许多不同的方法,包括:
- 用“加入”替换“包含”
- 将 'includes(:invites) 替换为 joins('LEFT JOIN "invites" ON "invites"."email" = "email" ')
- 更改 .text_search 和 .includes 调用的顺序。
- 在控制器、模型、范围和 text_search 函数定义中添加包含调用。
我不断收到相同的错误,并且在使用 SQL 的 join 调用时,它不会按邀请电子邮件过滤,并显示每个搜索结果的多次重复。
我会删除 include(:invites) 因为 text_search 本身工作得很好。但我真的需要包含这个条件。
任何帮助将不胜感激。也许我只是让我的 SQL 调用出错,但我也想了解为什么 .includes(:invites) 在没有 pg text_search 的情况下工作但不能使用它。
编辑 #1 - 更具体的问题
我认为这里有两个略有不同的问题。第一个似乎是结合 pg_search gem 和 'includes(:invites)' 调用的一些问题。第二个问题是我可以使用什么等效的 SQL 语句来避免调用 'includes(:invites)'。我认为它应该是某种 LEFT JOIN,但我认为我做得不对。在我的数据库中,笔记本有多个邀请,并且邀请具有属性“电子邮件”。我需要具有与 current_user 的电子邮件相等的电子邮件的邀请的笔记本。
对其中任何一个的帮助都会很棒。