如何在 SQL heredoc 中使用 sql IN 查询

How to use sql IN query in SQL heredoc

我想在 SQL heredoc 中使用数组常量,例如:

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"])
                       ^

而不是传递 ROLES.inspect 的结果,你应该自己制作带有角色的字符串,我会为此目的使用 mapjoin

query = <<-SQL
  SELECT * FROM users
  WHERE role IN (#{ROLES.map { |role| "'#{role}'" }.join(',')})
SQL
ApplicationRecord.connection.execute(query)

除了构建自己的 Ruby 到 SQL 转换器之外,您还可以使用 arel gem,它已经完成了必要的转义和引用。

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

或者如果你想去完整的区域。

ApplicationRecord.connection.execute(
  users.project(users[Arel.star])
       .where(users[:role].in(ROLES))
       .to_sql
)