0

次のクエリがあります。

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
4

1 に答える 1

0

実際に生成している SQL がなければ、エラーの原因を正確に特定するのは少し困難ですが、クエリ ツリー内のジョブと同じレベルにあるサブクエリ内のジョブを参照していることはほぼ確実です。

基本的に、機能しない構成は次のとおりです。

select ...
from foo, (select ... from bar where bar.x = foo.y) as baz

通常、最も簡単な修正は、それに応じてエイリアスを作成することです。

select ...
from foo, (select ... from bar, foo as foo2 where bar.x = foo2.y and ...) as baz

別の例については、こちらの質問を参照してください。

SQL サブクエリの質問、「エラー: FROM 節エントリへの参照が無効です ...」


あなたの場合、これは:

FROM 
    jobs, to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query 
WHERE 
    (tsv @@ query AND enabled = true) 

次のようにする必要があります。

FROM 
    jobs
WHERE 
    (tsv @@ to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AND enabled = true)

これもうまくいくはずです:

FROM 
    ( select to_tsquery('english', 'coffeescript|backbone.js|javascript|node.js') AS query ) q,
    jobs 
WHERE 
    (tsv @@ q.query AND enabled = true) 
于 2013-05-03T11:26:13.347 に答える