次のクエリがあります。
query = param.tag_list.join("|")
title = "ts_headline(title, query) AS title"
rank = "ts_rank_cd(tsv, query) AS rank"
Job.select(
[
title, rank, :starts_at, :slug, :job_position_id, :id, :city_id,
:company_office_id
]
).from(
"jobs, to_tsquery('english', '#{query}') AS query"
).where(
"tsv @@ query AND enabled = true"
).with_position.with_city.with_office.order(
"rank DESC, starts_at DESC"
).limit(limit)
with_* スコープは、位置、都市、オフィスをインクルードするだけです。それ以上ではありません。
これにより、Arel はエラーを生成するクエリを作成します。
ActiveRecord::StatementInvalid - PG::Error: エラー: テーブル "jobs" の FROM 節エントリへの参照が無効です 行 1: ...ER JOIN "job_positions" ON "job_positions"."id" = "jobs"."jo ... ^ ヒント: テーブル「jobs」のエントリがありますが、クエリのこの部分からは参照できません。
これは、暗黙の JOINS と明示的な JOINS が混在する問題に関連している可能性が最も高いです。このエラーも参照してください: FROM句への無効な参照
問題は、to_tsquery を使用してクエリを書き直して動作させる方法がわからないことです。
どんなアイデアでも事前に感謝します
アップデート
最終的に Arel によって生成される正確なクエリを次に示します。エラーは、最初の LEFT OUTER JOIN の jobs.job_position_id を参照しています
SELECT
...
FROM
jobs, to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query
LEFT OUTER JOIN
"job_positions" ON "job_positions"."id" = "jobs"."job_position_id"
LEFT OUTER JOIN
"cities" ON "cities"."id" = "jobs"."city_id"
LEFT OUTER JOIN
"company_offices" ON "company_offices"."id" = "jobs"."company_office_id"
LEFT OUTER JOIN
"companies" ON "companies"."id" = "company_offices"."company_id"
WHERE
(tsv @@ query AND enabled = true)
ORDER BY
rank DESC, starts_at DESC
LIMIT 9