SQL 構文エラー - ActiveRecord::StatementInvalid: PG::SyntaxError: エラー
概要
Rails で SQL クエリを構築するメソッドを作成しましたが、理由はわかりませんが、コードは正しいように見えますが、構文エラーが発生しました。 おそらくここで誰かが問題を見つけることができるでしょうか?それはおそらく私が気づいていないかなり明白な何かです。
私のコード:
def build_query(info_arr)
<<~SQL
SELECT * FROM word_group_values WHERE account_id = :account_id
AND word_group_id <> :word_group_id
AND ("title", location) IN #{info_arr.join(', ')}
SQL
end
得られるエラー:
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near ")" LINE 2: AND ("title", location) IN () ^ : SELECT * FROM word_group_values WHERE account_id = 110
AND ("title", location) IN ()
解決策
SQL 文字列が必要な理由はわかりませんが、2 つの列でレコードをフィルターするには、次の原則に従って SQL クエリを作成できます。
SELECT * FROM table WHERE (column1, column2) IN ((valu11, value21), (valu12, value22));
これは、文字列に外側かっこと内側かっこが必要であることを意味します
SQLクエリをサニタイズすることを忘れないでください
def build_query(account_id:, word_group_id:, titles_locations_filters: [])
base_query =
ActiveRecord::Base.sanitize_sql(
[
<<~SQL.squish,
SELECT * FROM word_group_values
WHERE account_id = :account_id
AND word_group_id <> :word_group_id
SQL
account_id:, word_group_id:
]
)
return base_query if titles_locations_filters.empty?
title_locations =
titles_locations_filters.map do |title, location|
ActiveRecord::Base.sanitize_sql([
'(:title, :location)', # inner brackets
title:, location:
])
end.join(', ')
"#{base_query} AND (title, location) IN (#{title_locations})" # outer brackets
end
そしてそれをそのように呼びます
account_id = 100
word_group_id = 200
titles_locations_filters = [%w[title1 location1], %w[title2 location2]]
build_query(account_id:, word_group_id:)
# SELECT * FROM word_group_values
# WHERE account_id = 100
# AND word_group_id <> 200
build_query(account_id:, word_group_id:, titles_locations_filters:)
# SELECT * FROM word_group_values
# WHERE account_id = 100
# AND word_group_id <> 200
# AND (title, location) IN (('title1', 'location1'), ('title2', 'location2'))