Ruby + Sequel - 将数组序列化为文本数组查询

时间:2015-02-06 07:30:41

标签: sql ruby arrays postgresql string-interpolation

我在ruby应用程序中有一个过滤器数组,它们对Postgres连接进行原始SQL查询。我试图找出如何将这个数组序列化为可查询的内容,

即:SELECT * FROM data WHERE strings IN #{strings_array}

我找不到任何资源。序列化此查询的正确方法是什么?

编辑:我最终搞清楚了:

query = ''
arr.each_with_index { |e, i|
  if i == arr.length - 1
    query += "#{e}"
  else
    query += "#{e},"
  end
}

然后

" AND column @> ('{#{query}}')"

但必须有一个不那么冗长的方式,不是吗?

3 个答案:

答案 0 :(得分:2)

如果您使用join这样的方法,这可能会更简洁:

# I presume arr contains an array that you want serialize
strings_array = "'#{arr.join("','")}'"
query = "SELECT * FROM data WHERE strings IN #{strings_array}" 

答案 1 :(得分:2)

你说你使用续集。续集可以自动执行这种查询:

DB[:data].where(strings: ["my", "array", "of", "strings"])
# => #<Sequel::Postgres::Dataset: "SELECT * FROM \"data\" WHERE (\"strings\" IN ('my', 'array', 'of', 'strings'))">

手工构建SQL查询&#34;&#34;风险很大,特别是如果您处理来自用户的数据。

答案 2 :(得分:-2)

一旦你学会了解ORM(在这种情况下是Activerecord),就不会像你那样手动或半自动地构建SQL。以此示例为例,它创建了与数据库的连接(在本例中为Oracle),将表映射到Ruby类,并为该类提供所有类型的管理方法。 在这个例子中,我使用两个where,一个带有散列作为过滤器,另一个带有一点点SQL。结果将是一个SQL,它会在您使用它时自动生成并执行(在这种情况下使用每个SQL)。

require 'active_record'

ActiveRecord::Base.establish_connection(
  :adapter => 'oracle_enhanced',
  :database => "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = ORATCP.world)(PROTOCOL = TCP)(Host = server.domain)(Port = 9999)))(CONNECT_DATA = (SID = SID_ID)))",
  :username => 'user',
  :password => 'password'
)

class Member < ActiveRecord::Base
  self.table_name = 'my_table'
end

Member.where(country: 'Belgium').where("'gender = 'M'").each do |member|
  p member
end