Как использовать sql IN запрос в SQL heredoc - PullRequest
0 голосов
/ 30 марта 2020

Я хочу использовать константу массива в SQL heredo c вроде:

ROLES = ['admin', 'staff', 'guest']

query = <<-SQL
  SELECT * FROM users
  WHERE role IN (#{ROLES})
SQL

ActiveRecord::Base.connection.execute(query)

, но получаю синтаксическую ошибку

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "["
LINE 2: WHERE role IN (["admin", "staff", "guest"])
                       ^

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вместо создания собственного конвертера Ruby в SQL вы также можете использовать гем arel , который уже делает необходимые экранирование и цитирование.

users = User.arel_table
ApplicationRecord.connection.execute(<<~SQL.squish)
  SELECT *
  FROM users
  WHERE #{users[:role].in(ROLES).to_sql}
SQL

Или если вы хотите go полный арель.

ApplicationRecord.connection.execute(
  users.project(users[Arel.star])
       .where(users[:role].in(ROLES))
       .to_sql
)
1 голос
/ 30 марта 2020

Вместо того, чтобы передавать результат ROLES.inspect, вы должны сделать строку с ролями самостоятельно, я бы использовал map и join для этой цели:

query = <<-SQL
  SELECT * FROM users
  WHERE role IN (#{ROLES.map { |role| "'#{role}'" }.join(',')})
SQL
ApplicationRecord.connection.execute(query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...